REF: call ensure_wrapped_if_datetimelike before the array arithmetic_op 
~This is on top of https://github.com/pandas-dev/pandas/pull/39772, so only the last commit needs to be looked at for now: https://github.com/pandas-dev/pandas/pull/39820/commits/bd50388e019c61559c310638186aeea57d2d2d3e~

The actual goal here is to have a version of [`array_ops.py::arithmetic_op`](https://github.com/pandas-dev/pandas/blob/9f792cd90373177bffa0e9f85a14d5d5b30fb289/pandas/core/ops/array_ops.py#L159-L191) that does *not* call `ensure_wrapped_if_datetimelike` on its arrays. Reason: when performing ops column-wise, this becomes unnecessary overhead, and so the goal is to ensure this on a higher level, before calling the `array_op`.

So the experiment in this PR is to actually remove `ensure_wrapped_if_datetimelike` from `arithmetic_op`, and then add it in the places that will call `arithmetic_op`, to see how much changes this needs. This would ensure that we can keep a single shared `arithmetic_op` for use by both ArrayManager and BlockManager. The alternative would be to make a variant of `arithmetic_op` without the `ensure_wrapped_if_datetimelike`. That would require fewer code changes, but would give some duplication around `arithmetic_op` content (but it's not that it is a long function). Thoughts on which approach to prefer?

cc @jbrockmendel 