fix #25, add support for multiple backends

This implements a generic NoPasswordBackend that one can inherit from
and implement a custom send_login_code() function to handle how the code
should be delivered to the user, be it by owl, email or sms. The
EmailBackend still exists, however it inherits from NoPasswordBackend.
The NoPasswordBackend is not useful on its own since it will raise an
NotImplementedError when send_login_code is called.