Added AmazonS3ClientFactory protocol...

This supports existing usage (e.g. passing creds as a map) and enables the
following scenarios:

* AmazonS3Client can be created and configured then used in place of `cred`
  This enables client configuration.
* AWSCredentials or AWSCredentialsProvider can be created and used in place of `cred`
  This enables other types of auth like STS.
* cred can be nil, causing a new s3-client to be created which checks the default
  provider chain for creds and uses anonymous creds if none are found.