feat: implement requestPasswordReset and resetPassword XRPC endpoints
Adds the two ATProto password reset endpoints (MM-156):
- POST /xrpc/com.atproto.server.requestPasswordReset — accepts an email,
generates a 1-hour single-use token stored as SHA-256 hash, and always
returns 200 regardless of whether the email exists (prevents enumeration).
Email delivery is stubbed as tracing::info\! for v0.1.
- POST /xrpc/com.atproto.server.resetPassword — validates the token,
hashes the new password with argon2id, and atomically marks the token
used and updates accounts.password_hash. Returns 401 InvalidToken for
unknown tokens and 400 ExpiredToken for expired or already-used tokens.
Also adds ErrorCode::ExpiredToken (HTTP 400, serialised as PascalCase
"ExpiredToken") to match the ATProto resetPassword lexicon exactly, and
V014 migration for the password_reset_tokens table.