Improving the error diagnostics.

The overall motivations are:
- reporting the error to logging is less useful since it's less contextual.
  The log message doesn't indicate where/why the authentication is attempted.
- for a person looking at a failure that the authentication is failing, it's
  not obvious that the server log contains more details.
  (and this plugin allows scoped credentials that doesn't necessarily belong
  to someone who has access to the server output.)

For this, pass in TaskListener and have implementations report errors to them.
A provision is made for the case the caller wants to suppress the error message.

The authenticate() is deprecated to make it very obvious that the caller should
supply a valid one.