feat(MM-70): error types and shared API envelope
Add ApiError + ErrorCode to the common crate with IntoResponse for Axum.
Serializes to { "error": { "code": "...", "message": "...", "details": {} } }.
Wave 0–2 error codes only; #[non_exhaustive] for future expansion.