<!--

Welcome to Apache Airflow!  For a smooth issue process, try to answer the following questions.
Don't worry if they're not all applicable; just try to include what you can :-)

If you need to include code snippets or logs, please put them in fenced code
blocks.  If they're super-long, please use the details tag like
<details><summary>super-long log</summary> lots of stuff </details>

Please delete these comment blocks before submitting the issue.

-->

**Description**

In Spark Kubernetes operator we have hard-coded API group and version for spark application k8s object:
https://github.com/apache/airflow/blob/b23a4cd6631ba3346787b285a7bdafd5e71b43b0/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py#L63-L65
I think it is not good, because we can have situation that some custom or not opensource Spark k8s operators can have different API group and version (like `sparkoperator.mydomain.com` instead of `sparkoperator.k8s.io`). 
<!-- A short description of your feature -->

**Use case / motivation**

User have got installed custom or commercial Spark Kubernetes operator and he wants to launch DAG with `SprkKubernetesOperator` from providers. User cannot do that without this implemented feature.

<!-- What do you want to happen?

Rather than telling us how you might implement this solution, try to take a
step back and describe what you are trying to achieve.

-->

**Are you willing to submit a PR?**

Yes
<!--- We accept contributions! -->

**Related Issues**

No
<!-- Is there currently another issue associated with this? -->

tests/providers/cncf/kubernetes/operators/test_spark_kubernetes.py
'metadata': {'name': 'spark-pi', 'namespace': 'default'},
    'spec': {
        'driver': {
            'coreLimit': '1200m',
            'cores': 1,
            'labels': {'version': '2.4.5'},
            'memory': '512m',
            'serviceAccount': 'spark',
            'volumeMounts': [{'mountPath': '/tmp', 'name': 'test-volume'}],
        },
        'executor': {
            'cores': 1,
            'instances': 1,
            'labels': {'version': '2.4.5'},
            'memory': '512m',
            'volumeMounts': [{'mountPath': '/tmp', 'name': 'test-volume'}],
        },
        'image': 'gcr.io/spark-operator/spark:v2.4.5',
        'imagePullPolicy': 'Always',
        'mainApplicationFile': 'local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar',
        'mainClass': 'org.apache.spark.examples.SparkPi',
        'mode': 'cluster',
        'restartPolicy': {'type': 'Never'},
        'sparkVersion': '2.4.5',
        'type': 'Scala',
        'volumes': [{'hostPath': {'path': '/tmp', 'type': 'Directory'}, 'name': 'test-volume'}],
    },
}
@patch('airflow.providers.cncf.kubernetes.hooks.kubernetes.KubernetesHook.get_conn')
class TestSparkKubernetesOperator(unittest.TestCase):