Support more AWS credentials providers for S3 storage

Build an AWS credentials provider chain that looks for credentials in this order:

* ConfigDrivenAwsCredentialsConfigProvider - the existing druid configuration file (accessKey+secretKey)
* LazyFileSessionCredentialsProvider - the existing druid configuration file (fileSessionCredentials)
* EnvironmentVariableCredentialsProvider - system environment variables (AWS_ACCESS_KEY_ID and AWS_SECRET_KEY)
* SystemPropertiesCredentialsProvider - Java System Properties (aws.accessKeyId and aws.secretKey)
* ProfileCredentialsProvider - Credential profiles file at the default location (~/.aws/credentials)
* InstanceProfileCredentialsProvider - Instance profile credentials delivered through the Amazon EC2 metadata service
It's just some optimistic, conditional locking around the lazy instantiation of the provider. Once provider is created, there's never a need to synchronize again.  

The first call will find provider is null, acquire the lock, then create the provider from the config.  Any concurrent callers to getUnderlyingProvider() will also fail the first check, block on the lock, but discover another thread has already created the provider by the time they are allowed to proceed.  It's probably overkill, but it's a thread-safe habit I've used to lazily instantiate singletons for a long time.