Adding credential providers and refactoring creds.

This commit adds a concept of credential providers, or functions that
when called return credentials or return null. This commit introduces
several credential providers that allow you to compose conditional
credential loading logic based on the environment the code is run in.

Addresses #371
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.
Modifying profile credentials for better error messages
Adding the ability to use a custom INI file path
Removing Credentials::factory(). Moving credential consts to Provider.