IterativeImputer strange implementation of fit_transform

### Describe the bug

A common scenario might be to subclass `IterativeImputer` to wrap some functionality around fit/transform/fit_transform methods.

it might look like this:

```
class Derived(IterativeImputer):

    def fit(self, X, y=None):
        ...
        super().fit(X,y)

   def transform(self, X, y=None):
        ...
        super().transform(X,y)

   def fit_transform(self, X, y=None):
        ...
        self.fit()
        return self.transform()
```

But if one calls this, it results in an infinite recursion because of the specific, non-intuitive way that `IterativeImputer` implements `.fit()` [that is by calling `fit_transform`].

In particular, 
```
Derived.fit(X)
```
ends up calling `super().fit()` which calls `self.fit_transform()` which calls `fit` again in the derived class.

The remediation for the programmer of `Derived` is to read the Sklearn code and rewrite his `fit` method as 
```
def fit(self, X, y=None):
    ...
    super().fit_transform(X,y)
```,
which is highly non-intuitive.

### Steps/Code to Reproduce

```
class Derived(IterativeImputer):

    def fit(self, X, y=None):
        super().fit(X,y)

    def transform(self, X, y=None):
        super().transform(X,y)

    def fit_transform(self, X, y=None):
        self.fit(X,y)
        return self.transform(X,y)
        
D = Derived()
D.fit(None)
```

### Expected Results

No infinite recursion when overriding `.fit()` method.

### Actual Results

```
---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
Input In [167], in <cell line: 14>()
     11         return self.transform(X,y)
     13 D = Derived()
---> 14 D.fit(None)

Input In [167], in Derived.fit(self, X, y)
      3 def fit(self, X, y=None):
----> 4     super().fit(X,y)

File ~/anaconda3/envs/dvbf-dev/lib/python3.10/site-packages/sklearn/impute/_iterative.py:789, in IterativeImputer.fit(self, X, y)
    772 def fit(self, X, y=None):
    773     """Fit the imputer on `X` and return self.
    774 
    775     Parameters
   (...)
    787         Fitted estimator.
    788     """
--> 789     self.fit_transform(X)
    790     return self

Input In [167], in Derived.fit_transform(self, X, y)
      9 def fit_transform(self, X, y=None):
---> 10     self.fit(X,y)
     11     return self.transform(X,y)

Input In [167], in Derived.fit(self, X, y)
      3 def fit(self, X, y=None):
----> 4     super().fit(X,y)

File ~/anaconda3/envs/dvbf-dev/lib/python3.10/site-packages/sklearn/impute/_iterative.py:789, in IterativeImputer.fit(self, X, y)
    772 def fit(self, X, y=None):
    773     """Fit the imputer on `X` and return self.
    774 
    775     Parameters
   (...)
    787         Fitted estimator.
    788     """
--> 789     self.fit_transform(X)
    790     return self

Input In [167], in Derived.fit_transform(self, X, y)
      9 def fit_transform(self, X, y=None):
---> 10     self.fit(X,y)
     11     return self.transform(X,y)

    [... skipping similar frames: Derived.fit at line 4 (988 times), IterativeImputer.fit at line 789 (988 times), Derived.fit_transform at line 10 (988 times)]

Input In [167], in Derived.fit(self, X, y)
      3 def fit(self, X, y=None):
----> 4     super().fit(X,y)

File ~/anaconda3/envs/dvbf-dev/lib/python3.10/site-packages/sklearn/impute/_iterative.py:789, in IterativeImputer.fit(self, X, y)
    772 def fit(self, X, y=None):
    773     """Fit the imputer on `X` and return self.
    774 
    775     Parameters
   (...)
    787         Fitted estimator.
    788     """
--> 789     self.fit_transform(X)
    790     return self

Input In [167], in Derived.fit_transform(self, X, y)
      9 def fit_transform(self, X, y=None):
---> 10     self.fit(X,y)
     11     return self.transform(X,y)

RecursionError: maximum recursion depth exceeded
```

### Versions

```shell
System:
    python: 3.10.6 | packaged by conda-forge | (main, Aug 22 2022, 20:43:44) [Clang 13.0.1 ]
executable: /Users/drams/anaconda3/envs/dvbf-dev/bin/python
   machine: macOS-11.6.6-x86_64-i386-64bit

Python dependencies:
      sklearn: 1.1.3
          pip: 22.3
   setuptools: 59.5.0
        numpy: 1.23.4
        scipy: 1.9.3
       Cython: 0.29.32
       pandas: 1.5.1
   matplotlib: 3.6.1
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: mkl
         prefix: libmkl_rt
       filepath: /Users/drams/anaconda3/envs/dvbf-dev/lib/libmkl_rt.dylib
        version: 2022.1-Product
threading_layer: intel
    num_threads: 6

       user_api: openmp
   internal_api: openmp
         prefix: libomp
       filepath: /Users/drams/anaconda3/envs/dvbf-dev/lib/libomp.dylib
        version: None
    num_threads: 12

       user_api: openmp
   internal_api: openmp
         prefix: libiomp
       filepath: /Users/drams/anaconda3/envs/dvbf-dev/lib/python3.10/site-packages/torch/lib/libiomp5.dylib
        version: None
    num_threads: 6
```

COMMENT:
If the parent class has `fit_transform`, you should be calling that, instead of `fit().transform()`, that solves the issue. This doesn't seem to be a bug to me.

Labels: Bug, Needs Triage