factor login providers (database, imap) into interface/implementations

A servlet context listener uses the cloudcoder configuration
to decide which provider implementation to instantiate.

This gives us a flexible mechanism for configuring an authentication
mechanism.
Added RemoteUserLoginProvider impl of ILoginProvider

This implementation authenticates based on an X-Remote-User
header added by a trusted proxy server.

Also, changed the "getInstance" method in
LoginProviderServletContextListener to "getProviderInstance",
which is a more meaningful name.