text: Title: S3 custom domain should be based on bucket name
  Body: I override the class `S3Boto3Storage` to create my own custom storage like below
  
  ```python
  class MediaStorage(S3Boto3Storage):
      bucket_name = 'my-media-bucket'
  ```
  
  I was expecting the file url generated by my custom storage `MediaStorage` will honor the bucket name and give the correct file url when I do the following:
  
  ```python
  media_storage = MediaStorage()
  media_storage.save(additional_path, file_obj)
  file_url = media_storage.url(additional_path)
  ```
  
  However, the generated `file_url` gives me a 404. When I look into the url, it did not use the bucket name of `MediaStorage` in domain name. After I looked at the implementation of the class `S3Boto3Storage`, the url is indeed not using `bucket_name` to generate url, and instead it always uses `settings.AWS_S3_CUSTOM_DOMAIN`, which I already set for my static file storage.
  
  I can see that the file is uploaded on S3, and the url S3 generated for the file is like `https://my-media-bucket.s3.amazonaws.com/path/to/the/file/`. I was expecting when I override `bucket_name`, the storage should use the bucket name to generate the url.
  
  I'm wondering is there any reason not to use bucket name to generate the url, or set the custom domain?
  
  I'm thinking of in class `S3Boto3Storage`, `def __init__`, let `custom_domain` honor `bucket_name` during the initialization. There're two ways I can think of:
  1. Set `custom_domain` to `self.custom_domain = '{}.s3.amazonaws.com'.format(self.bucket_name)`
  2. Replace the lowest level subdomain of `custom_domain` by `bucket_name`, if custom_domain is set.
  
  If any of these sounds good, I can create a PR, but just want to make sure if there's any consideration for the current behavior or concern about the change beforehand. Thank you!