Time-based one-time passwords

This introduces time-based one-time passwords as a sign up/in option.
Currently you can either join using PGP key or using TOTP, but not both.

Controversially, it changes the relation between user, key, and uid.
Unsure how this will play out.

Ran into a naming problem with the sub-resources under session and user:
both should be names `totps` and `keys`, but I wanted to use `create` on
each. So I named one set `by_totps` and `by_keys` instead.