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).
do we want to allow 6, 7, 8 characters as a config option? We can't use sha256/512 yet without dropping support for older erlang releases but same question for those.