Implement two factor authentication

If enabled, require a second factor to acquire a session cookie and
reject basic authentication attempts (as second factor cannot be
presented). Allow previous and next token for clock skew.

To enable this, you add a "2f" object to your user doc with a secret
"key" value.

This work is currently missing tests and documentation, and we'll
also want a UI (to render a QR code with an otpauth url for easy
setup).
each module should assert its own guards, I don't think there's a performance hit here (especially given we run an HMAC as a result...)