Real error messages when server actions fail

Server actions now show the real error message instead of a numeric error code.

Bug Fixes

Server actions previously returned numeric error codes (like "3002") to the frontend, hiding the real error message from users. Now they surface the actual error message — so when an operation fails, you see "Cannot copy a client-approved estimate" instead of a code.

The fix also includes estimate-page polish: locked estimates now show a disabled "Locked: client approved" item in the actions menu, and removed duplicate approval status rows from the timeline for a cleaner flow.