**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/models/baseoperator.py
"""Returns reference to XCom pushed by current operator"""
        from airflow.models.xcom_arg import XComArg
        return XComArg(operator=self)
    @staticmethod
    def xcom_push(
            context: Any,
            key: str,
            value: Any,
            execution_date: Optional[datetime] = None,
    ) -> None:
        """
        Make an XCom available for tasks to pull.
        :param context: Execution Context Dictionary
        :type: Any
        :param key: A key for the XCom
        :type key: str
        :param value: A value for the XCom. The value is pickled and stored
            in the database.
        :type value: any pickleable object
        :param execution_date: if provided, the XCom will not be visible until
            this date. This can be used, for example, to send a message to a
            task on a future date without it being immediately visible.
        :type execution_date: datetime
        """
        context['ti'].xcom_push(
            key=key,
            value=value,
            execution_date=execution_date)
    @staticmethod
    def xcom_pull(