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:
Here are my thoughts since I work with all the dataframe libraries above, Spark and other frameworks.. I'll just list the PROs only..

**substrait.io plan**
https://substrait.io/
If you can define a set of logical operations it can be execute on any "substrait" compatible dataframe / engine.
This currently includes R, Presto, Spark, Clickhouse and PyArrow. You can get native dataframe execution as the list of substrait supported dataframes / engine grows.
This also allows developers to code stuff in one library and execute in production using some other library which is more robust and scalable.

**custom transformer**
With regards to pypolars. Pypolars supports a lazy execution model which will look at all your transformations and optimize it.. Filters can all be moved to execute first. Aggregations can be combined, etc.. This requires everything to execute in pypolars without converting back and forth between pandas.

**transformer**
Ok here is a con.. Converting to pandas should be replaced with converting to arrow instead. Pandas 2.0 has added support for pyarrow columns vs numpy columns. There are just issues with numpy backed pandas like variable string columns saved in memory as dtype objects instead of real strings or no NULLs allowed in integer columns. Pandas, PyPolars, R dataframe, DuckDB, etc.. all support arrow under the hood already to move data in and out which could be processed by scikit..

Labels: New Feature, RFC