BUG: DataFrame.diff(axis=1) with mixed (or EA) dtypes
- [ ] closes #xxxx
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

> Can we instead skip doing things blockwise for axis=1 and do it columnwise instead?

That would also allow us to avoid consolidating, which would be nice. updated to operate column-wise.

DatetimeTZBlock.diff could have its NotImplementedError case removed in a follow-up Do we have anything approaching consensus here?  I'm OK with either column-wise or transpose I'm pretty strongly in favor of columnwise when there's more than 1 block. While I don't think sparse support should ever be a primary motivator, the difference in performance of a columnwise diff vs. a `.T.diff().T` for something like

```python
In [6]: a = pd.arrays.SparseArray([1] + [0] * 1000)

In [7]: df = pd.DataFrame({"A": a, "B": a})
```

will be huge. @jreback is column-wise vs transpose a deal breaker?  if not, i think this is ready if you really want to do columnwise can you move impl to another location as indicated

the code is pretty complex and should be separated from inline in the function  thanks, IIRC there *might* be some issues this closes if you'd have a look