fix(MM-70): address PR review — feature-gate axum, private fields, Error impl
- common/axum feature: IntoResponse opt-in via [features] axum = ["dep:axum"];
relay enables it, pure-logic crates stay lightweight (orphan rule prevents
moving impl to relay, so feature gating is the correct Rust idiom)
- ErrorCode::status_code() now returns u16 instead of axum::http::StatusCode
- ApiError fields made private; status_code(&self) -> u16 added as accessor
- ApiError derives thiserror::Error with #[error("{code:?}: {message}")]
- Removed Deserialize from ErrorCode (outward-only flow)
- IntoResponse fallback logs via tracing::error! on serialization failure
- End-to-end tokio::test verifies status code and body via .into_response()
- Fixed doc comment: shows both with-details and without-details examples
- Removed // pattern: Functional Core and temporal Wave 0–2 set comments
- Added TODO listing remaining Appendix A codes for later waves