Make client creation more flexible.

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. (e.g. the default client
  behavior)

If this seems like overkill, allowing an `AmazonS3Client` anywhere `creds` are expected would also be fine.

Thanks for the great libraries!