### Description

When a file is uploaded to GCS, [by default](https://cloud.google.com/storage/docs/metadata#cache-control), public files will get `Cache-Control: public, max-age=3600`.

I've tried setting `cors` for the whole bucket (didn't work) and setting `Cache-Control` on individual file (disappears on file re-upload from airflow)

Setting `metadata` for GCSHook is for different field (can't be used to set cache-control)

### Use case/motivation

Allow GCSHook to set cache control rather than overriding the `upload` function

### Related issues

_No response_

### Are you willing to submit a PR?

- [X] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

num_file_attempts = 0
        while True:
            try:
                num_file_attempts += 1
                client = self.get_conn()
                bucket = client.bucket(bucket_name)
                blob = bucket.blob(blob_name=object_name, chunk_size=chunk_size)
                if filename:
                    blob.download_to_filename(filename, timeout=timeout)
                    self.log.info("File downloaded to %s", filename)
                    return filename
                else:
                    return blob.download_as_bytes()
            except GoogleCloudError:
                if num_file_attempts == num_max_attempts:
                    self.log.error(
                        "Download attempt of object: %s from %s has failed. Attempt: %s, max %s.",
                        object_name,
                        bucket_name,
                        num_file_attempts,
                        num_max_attempts,
                    )
                    raise
                
                timeout_seconds = 1.0 * 2 ** (num_file_attempts - 1)
                time.sleep(timeout_seconds)
                continue
    def download_as_byte_array(