 [ArrayManager] Array version of interpolate logic
Similar to what I did in https://github.com/pandas-dev/pandas/pull/41104 for `fillna` (xref https://github.com/pandas-dev/pandas/issues/39146).

This also improves the performance for some of the fillna/interpolate benchmarks (mostly due to avoiding the overhead of creating a block for each column). For example (from ` frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'datetime64[ns]')`:

```python
N, M = 10000, 100
dtype = "datetime64[ns]"
data = pd.date_range("2011-01-01", freq="H", periods=N)
df = pd.DataFrame({f"col_{i}": data for i in range(M)})
df[::2] = None
df_am = df._as_manager("array").copy()

In [2]: %timeit df_am.fillna(inplace=True, method="bfill")
7.31 ms ± 313 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  # <-- master
3.57 ms ± 370 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  # <-- PR
```


Can any of this be shared with the Block method? > Can any of this be shared with the Block method?

I think the actual interpolate function is already shared (i.e. `interpolate_array_2d`). The rest is mostly some boilerplate that is slightly different (eg the Block method has an additional check to split the block). I think the `try/except` for `clean_fill_method` could be shared, but I am not sure it is worth creating another function for those few lines. I increasingly think that this type of change should be left until right before BlockManager is ripped out. Until then, this just duplicates code and makes it easy for behavior to accidentally drift apart. This pull request is stale because it has been open for thirty days with no activity. Please [update](https://pandas.pydata.org/pandas-docs/stable/development/contributing.html#updating-your-pull-request) and respond to this comment if you're still interested in working on this. Thanks for the pull request, but it appears to have gone stale. If interested in continuing, please merge in the main branch, address any review comments and/or failing tests, and we can reopen.