### Description

Add listeners for Datasets (events)

### Use case/motivation

As Airflow administrators, we would like to trigger some external processes based on all datasets being created/updated by our users. We came across the listeners for the dag runs and task instances (which are also useful), but are still missing listeners for datasets.

### Related issues

_No response_

### Are you willing to submit a PR?

- [ ] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

"""Validate the DAG has a coherent setup.
        This is called by the DAG bag before bagging the DAG.
        """
        if not self._check_schedule_interval_matches_timetable():
            raise AirflowDagInconsistent(
                f"inconsistent schedule: timetable {self.timetable.summary!r} "
                f"does not match schedule_interval {self.schedule_interval!r}",
            )
        self.validate_schedule_and_params()
        self.timetable.validate()
        self.validate_setup_teardown()
    def validate_setup_teardown(self):
        """
        Validate that setup and teardown tasks are configured properly.
        :meta private:
        """
        for task in self.tasks:
            if task.is_setup:
                for down_task in task.downstream_list:
                    if not down_task.is_teardown and down_task.trigger_rule != TriggerRule.ALL_SUCCESS:
                        
                        
                        
                        raise ValueError("Setup tasks must be followed with trigger rule ALL_SUCCESS.")
            FailStopDagInvalidTriggerRule.check(dag=self, trigger_rule=task.trigger_rule)
    def __repr__(self):