nested columntransformers missing _columns with metadata_routing enabled

### Describe the bug

When calling fit on a nested column transformer within a pipeline an AttributeError is raised. When fit is called, `process_routing` is invoked which in turn calls _iter and zips with self._columns. But _columns is not realized yet, as _validate_column_callables has yet to be called.

### Steps/Code to Reproduce

```python
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import StandardScaler
import pandas as pd
from sklearn import set_config

set_config(enable_metadata_routing=True)

if __name__ == "__main__":
    df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
    inner = make_column_transformer((StandardScaler(), ["a"]), remainder="passthrough")
    pipeline = make_pipeline(inner)
    column_transformer = make_column_transformer((pipeline, ["a"]))
    column_transformer.fit(df)
```

### Expected Results

No error is thrown

### Actual Results

```python
Traceback (most recent call last):
  File "c:\Users\gravesee\projects\dsgtools\bug.py", line 13, in <module>
    column_transformer.fit(df)
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\compose\_column_transformer.py", line 860, in fit
    self.fit_transform(X, y=y, **params)
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\utils\_set_output.py", line 273, in wrapped
    data_to_wrap = f(self, X, *args, **kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\base.py", line 1351, in wrapper
    return fit_method(estimator, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\compose\_column_transformer.py", line 910, in fit_transform
    routed_params = process_routing(self, "fit_transform", **params)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\utils\_metadata_requests.py", line 1555, in process_routing
    request_routing = get_routing_for_object(_obj)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\utils\_metadata_requests.py", line 1132, in get_routing_for_object
    return deepcopy(obj.get_metadata_routing())
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\compose\_column_transformer.py", line 1174, in get_metadata_routing
    router.add(method_mapping=method_mapping, **{name: step})
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\utils\_metadata_requests.py", line 862, in add
    mapping=method_mapping, router=get_routing_for_object(obj)
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\utils\_metadata_requests.py", line 1132, in get_routing_for_object
    return deepcopy(obj.get_metadata_routing())
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\pipeline.py", line 1185, in get_metadata_routing
    router.add(method_mapping=method_mapping, **{final_name: final_est})
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\utils\_metadata_requests.py", line 862, in add
    mapping=method_mapping, router=get_routing_for_object(obj)
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\utils\_metadata_requests.py", line 1132, in get_routing_for_object
    return deepcopy(obj.get_metadata_routing())
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\compose\_column_transformer.py", line 1153, in get_metadata_routing
    for name, step, _, _ in self._iter(
  File "c:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\compose\_column_transformer.py", line 426, in _iter
    for (name, trans, _), column in zip(self.transformers, self._columns)
                                                           ^^^^^^^^^^^^^
AttributeError: 'ColumnTransformer' object has no attribute '_columns'
```


### Versions

```shell
System:
    python: 3.11.1 (tags/v3.11.1:a7a450f, Dec  6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)]
executable: C:\Users\gravesee\projects\dsgtools\.venv\Scripts\python.exe
   machine: Windows-10-10.0.22621-SP0

Python dependencies:
      sklearn: 1.4.0
          pip: 22.3.1
   setuptools: 64.0.2
        numpy: 1.26.2
        scipy: 1.10.1
       Cython: None
       pandas: 2.2.0
   matplotlib: 3.7.0
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: openmp
   internal_api: openmp
         prefix: vcomp
       filepath: C:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\sklearn\.libs\vcomp140.dll
        version: None
    num_threads: 8

       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: C:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\numpy.libs\libopenblas64__v0.3.23-293-gc2f4bdbb-gcc_10_3_0-2bde3a66a51006b2b53eb373ff767a3f.dll
        version: 0.3.23.dev
threading_layer: pthreads
   architecture: SkylakeX
    num_threads: 8

       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: C:\Users\gravesee\projects\dsgtools\.venv\Lib\site-packages\scipy.libs\libopenblas-802f9ed1179cb9c9b03d67ff79f48187.dll
        version: 0.3.18
threading_layer: pthreads
   architecture: SkylakeX
    num_threads: 8
```

COMMENT:
Thanks for reporting. Already fixed on `main` and will be in the next patch release.

Labels: Bug, Needs Triage