Support other dataframes like polars and pyarrow not just pandas

### Describe the workflow you want to enable

Currently, scikit-learn nowhere claims to support [pyarrow](https://arrow.apache.org/docs/python/) or [polars](https://www.pola.rs/). And indeed,
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, KBinsDiscretizer
from sklearn.compose import ColumnTransformer

X, y = load_iris(as_frame=True, return_X_y=True)
sepal_cols = ["sepal length (cm)", "sepal width (cm)"]
petal_cols = ["petal length (cm)", "petal width (cm)"]

preprocessor = ColumnTransformer(
    [
        ("scaler", StandardScaler(), sepal_cols),
        ("kbin", KBinsDiscretizer(encode="ordinal"), petal_cols),
    ],
    verbose_feature_names_out=False,
)

import polars as pl  # or import pyarrow as pa
X_pl = pl.from_pandas(X)  # or X_pa = pa.table(X)

preprocessor.fit_transform(X_pl)
# preprocessor.set_output(transform="pandas").fit_transform(X_pl)
```

errors with
```
AttributeError: 'numpy.ndarray' object has no attribute 'columns'

During handling of the above exception, another exception occurred:

ValueError: Specifying the columns using strings is only supported for pandas DataFrames
```

### Describe your proposed solution

scikit-learn should support those dataframes, maybe via the [python dataframe interchange protocol](https://data-apis.org/dataframe-protocol/latest/index.html).

In that regard, a new option like `set_output(transform="dataframe")` would be nice.

### Describe alternatives you've considered, if relevant

_No response_

### Additional context

Some related discussion came up in #25813.

COMMENT:
I see three features with dataframes + a default option.

**TLDR**: The engineering to get other DataFrames to work is doable. Implementation-wise, I prefer to lean as much as we can on the DataFrame exchange protocol.

## Support other dataframes in `ColumnTransformer` as input.

If we want to support Polars directly, we need to extend `ColumnTransformer` to recognize it. Although its not too hard to add polars as an optional dependency, I'll prefer to use the dataframe exchange protocol to get the data out of the input DataFrame.

## Support other dataframes for output in `set_output`.

When designing `set_output`, I left the API open so that we can have the following API:

```python
def construct_polars_df(data, columns, index):
    # ignore index since polars does not have an index
    return pl.from_numpy(data, columns=columns)

# API does not work now, but not hard to enable.
transformer.set_output(transform=construct_polars_df)
```

The above API would configure scikit-learn to output polars DataFrames. The other piece is to get `check_array` to work with polars dataframes, which currently has some issues: https://github.com/scikit-learn/scikit-learn/pull/25813#issuecomment-1466466629. Note that even if we get polars to work in a pipeline, it will have to go through many copies because polars <-> NumPy which is not free. Pandas does not have this issue because it can be backed by a NumPy array using pandas's BlockManager. 
 
## Generic set_output(transform="dataframe")

Assuming this means **"dataframe in -> dataframe out"**, I think it's best to enable this with the dataframe exchange protocol when https://github.com/data-apis/dataframe-api/issues/42 is decided. As with the above, we'll need to update `check_array` to work with the exchange protocol. If we do not want to wait for https://github.com/data-apis/dataframe-api/issues/42, we can have an optional dependencies on the dataframe libraries.

## Default option: Do not extend support for other DataFrames

Given that Pandas 2.0 DataFrames can be backed by arrow, Polars can now go from polars -> pandas with zero copy. As stated in https://github.com/scikit-learn/scikit-learn/issues/25896#issuecomment-1475223523, one can convert the polars dataframe into a pandas one before passing it to `ColumnTransformer`. This gives us the option of **"Do not extend support for other DataFrames and recommend converting DataFrames into pandas because the conversion is zero copy"**.

Labels: New Feature, RFC