### Description

Replace the existing selects with multi-selects that allow you to filter multiple DAG run states and types at the same time, somewhat similar to my prototype:

![image](https://github.com/apache/airflow/assets/1842905/c4ec0793-1ccb-417d-989c-781997416f97)


### Use case/motivation

I'm not sure if it is just me, but sometimes I wish I was able to show multiple DAG run states, especially `running` and `failed`, at the same time. 
This would be especially helpful for busy DAGs on which I want to clear a few failed runs. Without the multi-select, if I switch from `failed` to `running` DAG runs, I need to orient myself again to find the run I just cleared (assuming there are lots of other running DAG runs). _With_ the multi-select, the DAG run I just cleared stays in the same spot and I can check the logs, while clearing some other failed runs.

I'm not sure we need a multi-select for DAG run types as well. I'd tend to say no, but maybe someone else has a use-case for that.

### Related issues

_No response_

### Are you willing to submit a PR?

- [X] 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)

if has_event_filters:
                count_query = count_query.join(DatasetEvent, DatasetEvent.dataset_id == DatasetModel.id)
            filters = [~DatasetModel.is_orphaned]
            if uri_pattern:
                filters.append(DatasetModel.uri.ilike(f"%{uri_pattern}%"))
            if updated_after:
                filters.append(DatasetEvent.timestamp >= updated_after)
            if updated_before:
                filters.append(DatasetEvent.timestamp <= updated_before)
            query = query.where(*filters).offset(offset).limit(limit)
            count_query = count_query.where(*filters)
            query = session.execute(query)
            datasets = [dict(dataset) for dataset in query]
            data = {"datasets": datasets, "total_entries": session.scalar(count_query)}
            return (
                htmlsafe_json_dumps(data, separators=(",", ":"), cls=utils_json.WebEncoder),
                {"Content-Type": "application/json; charset=utf-8"},
            )
    @expose("/robots.txt")
    @action_logging
    def robots(self):
        """
        Return a robots.txt file for blocking certain search engine crawlers.
        This mitigates some of the risk associated with exposing Airflow to the public
        internet, however it does not address the real security risks associated with
        such a deployment.
        """
        return send_from_directory(get_airflow_app().static_folder, "robots.txt")
    @expose("/audit_log")
    def legacy_audit_log(self):