<!--

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**

The possibility to add a lineage backend was removed in https://github.com/apache/airflow/pull/6564 but was never reintroduced. Now that this code is in 2.0, the lineage information is only in the xcoms and the only way to get it is through an experimental API that isn't very practical either.

**Use case / motivation**

A custom callback at the time lineage gets pushed is enough to send the lineage information to whatever lineage backend the user has.

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

I'd be willing to make a PR recovering the LineageBackend and add changes if needed, unless there is a different plan for lineage from the maintainers.

airflow/lineage/__init__.py
task_ids = (
                set(filter(lambda x: isinstance(x, str) and x.lower() != AUTO, self._inlets))
                .union(map(lambda op: op.task_id, filter(lambda op: isinstance(op, Operator), self._inlets)))
                .intersection(self.get_flat_relative_ids(upstream=True))
            )
            
            if AUTO.upper() in self._inlets or AUTO.lower() in self._inlets:
                task_ids = task_ids.union(task_ids.symmetric_difference(self.upstream_task_ids))
            _inlets = self.xcom_pull(context, task_ids=task_ids, dag_id=self.dag_id, key=PIPELINE_OUTLETS)
            
            _inlets = [
                _get_instance(structure(item, Metadata)) for sublist in _inlets if sublist for item in sublist
            ]
            self.inlets.extend(_inlets)
            self.inlets.extend(self._inlets)
        elif self._inlets:
            raise AttributeError("inlets is not a list, operator, string or attr annotated object")
        if not isinstance(self._outlets, list):
            self._outlets = [
                self._outlets,
            ]
        self.outlets.extend(self._outlets)
        
        self.inlets = [_render_object(i, context) for i in self.inlets if attr.has(i)]
        self.outlets = [_render_object(i, context) for i in self.outlets if attr.has(i)]
        self.log.debug("inlets: %s, outlets: %s", self.inlets, self.outlets)
        return func(self, context, *args, **kwargs)
    return cast(T, wrapper)