Behaviour for the AWS storage adapter's S3 client boundary.
@callback delete_object(String.t(), String.t(), keyword()) :: :ok | {:error, term()}
@callback get_object(String.t(), String.t(), keyword()) :: {:ok, binary()} | {:error, term()}
@callback put_object(String.t(), String.t(), binary(), String.t(), keyword()) :: {:ok, String.t()} | {:error, term()}