### Apache Airflow Provider(s)

salesforce

### Versions of Apache Airflow Providers

apache-airflow-providers-salesforce==1!3.2.0

### Apache Airflow version

2.1.4

### Operating System

Debian GNU/Linux 10 (buster)

### Deployment

Astronomer

### Deployment details

_No response_

### What happened

Right now the `SalesforceHook` is requiring all of the extras for a Salesforce connection type in Airflow.

I am assuming this issue was never brought up before because users of this hook have been using the Airflow UI to make connections (which presents all extra fields), however with things such as Secrets Backends, it should be possible to set up a Salesforce connection URI without having to explicitly provide all of the extras.

The issue is the hook's author designed the hook's `get_conn` to pass in every extra value using an improper/invalid method of defaulting to None by using `or None` but still referencing the extras key directly. I tested this in as low as Python 2.7 and as high as Python 3.7 and in both versions if any one of these extras are not provided you will get a `KeyError`

https://github.com/apache/airflow/blob/e9a72a4e95e6d23bae010ad92499cd7b06d50037/airflow/providers/salesforce/hooks/salesforce.py#L137-L149

### What you expected to happen

Any extras value not provided should just default to None (or to `api.DEFAULT_API_VERSION` for the "version" extra). It should be possible to set up a Salesforce connection URI using a secrets backend without having to explicitly provide all of the extras.

### How to reproduce

Set up a secrets backend (such as via environment variable) and pass in the minimum connection values needed for "Password" connection type:

_(this is an example, no real passwords shown)_
`export AIRFLOW_CONN_SALESFORCE_DEFAULT='http://your_username:your_password@https%3A%2F%2Fyour_host.lightning.force.com?extra__salesforce__security_token=your_token'`

It will error with `KeyError: 'extra__salesforce__domain'` and keep resulting in key errors for each extras key until you finally provide all extras, like so:

_(this is an example, no real passwords shown)_
`export AIRFLOW_CONN_SALESFORCE_DEFAULT='http://your_username:your_password@https%3A%2F%2Fyour_host.lightning.force.com?extra__salesforce__security_token=your_token&extra__salesforce__domain=&extra__salesforce__instance=&extra__salesforce__instance_url=&extra__salesforce__organization_id=&extra__salesforce__version=&extra__salesforce__proxies=&extra__salesforce__client_id=&extra__salesforce__consumer_key=&extra__salesforce__private_key_file_path=&extra__salesforce__private_key='`

### Anything else

In addition to this, the `SalesforceHook` should also accept extras without the need for the `extra__salesforce__` prefix, like many other connections do.

### Are you willing to submit 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)

airflow/providers/salesforce/hooks/salesforce.py
JSON array but each element is new-line delimited instead of comma delimited like in `json`
        This requires a significant amount of cleanup.
        Pandas doesn't handle output to CSV and json in a uniform way.
        This is especially painful for datetime types.
        Pandas wants to write them as strings in CSV, but as millisecond Unix timestamps.
        By default, this function will try and leave all values as they are represented in Salesforce.
        You use the `coerce_to_timestamp` flag to force all datetimes to become Unix timestamps (UTC).
        This is can be greatly beneficial as it will make all of your datetime fields look the same,
        and makes it easier to work with in other database environments
        :param query_results: the results from a SQL query
        :type query_results: list of dict
        :param filename: the name of the file where the data should be dumped to
        :type filename: str
        :param fmt: the format you want the output in. Default:  'csv'
        :type fmt: str
        :param coerce_to_timestamp: True if you want all datetime fields to be converted into Unix timestamps.
            False if you want them to be left in the same format as they were in Salesforce.
            Leaving the value as False will result in datetimes being strings. Default: False
        :type coerce_to_timestamp: bool
        :param record_time_added: True if you want to add a Unix timestamp field
            to the resulting data that marks when the data was fetched from Salesforce. Default: False
        :type record_time_added: bool
        :return: the dataframe that gets written to the file.
        :rtype: pandas.Dataframe
        """
        fmt = fmt.lower()
        if fmt not in ['csv', 'json', 'ndjson']:
            raise ValueError(f"Format value is not recognized: {fmt}")
        df = self.object_to_df(
            query_results=query_results,