Change the authenticator API to take request and response.

The previous API takes challenges and returns credentials. This isn't
very flexible because it means our challenge and credentials classes
must model everything.
Merge pull request #744 from square/jwilson_0421_restructure_authenticator

Change the authenticator API to take request and response.
Clarified behavior of AsyncApi when a request is cancelled.