**Description**

Currently `BaseOperator` and `XComArgs` implements the same logic of `__lshift__`, `__rshift__` and others "chain" operations (`>>`, `<<`). It seems resonable to abstract this logic into `TaskMixin` to introduce some DRYness especially because the new concept of `TaskGroup` will also implement the same methods.

**Use case / motivation**

Limit duplication of logic.

**Related Issues**

https://github.com/apache/airflow/pull/10827#issuecomment-691927501
#10153 

airflow/example_dags/example_xcomargs.py
"""Dummy function"""
    ctx = get_current_context()
    log.info("The knights of Ni say: %s (at %s)", value, ctx['ts'])
with DAG(
    dag_id='example_xcom_args',
    default_args={'owner': 'airflow'},
    start_date=days_ago(2),
    schedule_interval=None,
    tags=['example'],
) as dag:
    task1 = PythonOperator(
        task_id='generate_value',
        python_callable=generate_value,
    )
    print_value(task1.output)
with DAG(
    "example_xcom_args_with_operators",
    default_args={'owner': 'airflow'},
    start_date=days_ago(2),
    schedule_interval=None,
    tags=['example'],
) as dag2:
    bash_op1 = BashOperator(task_id="c", bash_command="echo c")
    bash_op2 = BashOperator(task_id="d", bash_command="echo c")
    xcom_args_a = print_value("first!")  
    xcom_args_b = print_value("second!")  
    bash_op1 >> xcom_args_a >> xcom_args_b >> bash_op2