Change authenticateAsync to return a future

Also add some documentation to the Authenticator interface and implement
AppEngineAuthFuture.
Move AppEngine implementations into their own package