feat(auth): record the sign-in audit trail
Adds auth_events and the logger writing it: sign-ins and refusals, password changes and recoveries, revoked sessions, granted and revoked roles. The logger fills in the address, the browser and the actor itself, so no caller can forget them, and the impersonator is named rather than the account being browsed as.
Attempts refused by the throttle are not recorded: they follow from failures already in the log, and a row per attempt would let anyone fill the table. auth:cleanup drops entries older than --event-retention-days (180 by default).
Fixes a gap left by the session work: completing a password recovery now revokes every session of the owner, without the exception a password change makes for the current one — whoever recovers a password is not signed in.