Fixes IAuthenticator interface. Refactors existing code.

Previously IAuthenticator was an empty tag interface.
This provided no benefit, despite the cost of casting
in numerous locations. This changes the interface so
that the needed members are specified, and migrates
existing subclasses to use interface implementation
instead of inheritance, making them more flexible.