### 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)

"""Iterate through provider-backed connection fields.
        Note that this cannot be a property (including a cached property)
        because Flask-Appbuilder attempts to access all members on startup, and
        using a property would initialize the providers manager too eagerly.
        Returns tuple of:
        * key
        * field_name
        * whether the field is sensitive
        """
        return (
            (k, v.field_name, v.is_sensitive) for k, v in ProvidersManager().connection_form_widgets.items()
        )
    @property
    def add_columns(self) -> list[str]:
        """A list of columns to show in the Add form.
        This dynamically calculates additional fields from providers and add
        them to the backing list. This calculation is done exactly once (by
        checking we're referencing the class-level variable instead of the
        instance-level), and only after we enter the request context (to skip
        superfuluous checks done by Flask-Appbuilder on startup).
        """
        if self._add_columns is type(self)._add_columns and has_request_context():
            self._add_columns = [
                *self._add_columns,
                *(k for k, _, _ in self._iter_extra_field_names_and_sensitivity()),
            ]
        return self._add_columns
    @property
    def edit_columns(self) -> list[str]: