Credential provider cleanup.

Adds credential profile support to client factory so that you can
provide a `chain()` to the 'credentials' option without having to call the
`resolve()` function manually.

Now that providers can be passed to a client factory, it means that
credential providers can potentially be called multiple times which
could be an expensive call. This commit now adds a memoize function that
caches previously resolved credentials while ensuring that memoized
credentials are not expired.

Added a `defaultProvider()` function to create a default credentials
provider.

Removed the `hardcoded()` provider. This doesn't have much use and can
be achieved using a simple provider function.

`chain()` provider is now variadic (it's prettier).

Separated the `profile` client option from the client factory into it's
own handler function. This cleans up the credentials handler and removes
an extra check when it isn't needed.