**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
"""
        Sets inlets to this operator
        """
        self._inlets.extend(inlets)
    def add_outlets(self, outlets: Iterable[Any]):
        """
        Defines the outlets of this operator
        """
        self._outlets.extend(outlets)
    def get_inlet_defs(self):
        """
        :return: list of inlets defined for this operator
        """
        return self._inlets
    def get_outlet_defs(self):
        """
        :return: list of outlets defined for this operator
        """
        return self._outlets
    @property
    def dag(self) -> Any: