Split authentication out of Connect() and into a new Authenticate() method.

This allows clients to connect without authenticating in order to check
the server for supported features (like StartTLS, auth mechanisms, etc).