**Description**

Similarly to `@dag` and `@task` decorators, we can add a decorator to easily generate `TaskGroup` instances. 

**Use case / motivation**

This would be used for reusable pieces of DAGs. An example may be to hyperparameter tune an ML pipeline. You may want to generate several parallel subpipelines with different settings/parameters to be executed in parallel. At the end pull the result and decide the best parametrization.  

```py
@task
collect_dataset(...)
  pass

@task
def train_model(...)
   pass

@task_group
def movielens_model_pipeline(learning_rate: int, feature_list: list, dataset: XComArg):  
  dataset = filter_dataset(dataset, feature_list)
  train_model(dataset, learning_rate)

@dag
def movielens_hpt(dataset_path: str, feature_list:list=['year', 'director']):
  dataset = load_dataset(dataset_path)
  for i in range(0.1, 0.9, step=0.1):
    movielens_model_pipeline(i, feature_list, dataset)
  
  decide_best_model(...)
```




**Related Issues**

https://github.com/apache/airflow/issues?q=is%3Aopen+is%3Aissue+label%3AAIP-31


tests/utils/test_task_group.py
with TaskGroup("group34") as group34:
                _ = DummyOperator(task_id="task3")
                _ = DummyOperator(task_id="task4")
        with TaskGroup("group6") as group6:
            _ = DummyOperator(task_id="task6")
        task7 = DummyOperator(task_id="task7")
        task5 = DummyOperator(task_id="task5")
        task1 >> group234
        group34 >> task5
        group234 >> group6
        group234 >> task7
    subdag = dag.sub_dag(task_ids_or_regex="task5", include_upstream=True, include_downstream=False)
    assert extract_node_id(task_group_to_dict(subdag.task_group)) == {
        'id': None,
        'children': [
            {
                'id': 'group234',
                'children': [
                    {
                        'id': 'group234.group34',
                        'children': [
                            {'id': 'group234.group34.task3'},
                            {'id': 'group234.group34.task4'},
                            {'id': 'group234.group34.downstream_join_id'},
                        ],
                    },
                    {'id': 'group234.upstream_join_id'},
                ],
            },
            {'id': 'task1'},