ENH: Implement EA unary ops
- [x] closes #23087
- [x] tests added / passed
    - [x] Array
    - [x] Series
    - [x] DataFrame
    - [x] Panel
    - [x] Sparse
    - [x] Extension (Decimal)
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

Changed to apply unary funcs per blocks. As a result, unexpected dtype changes are also fixed (as below).
```
# Current master
(-pd.DataFrame({'a': [1], 'b': [1.1]})).dtypes
# a    float64
# b    float64
# dtype: object

# After the PR
(-pd.DataFrame({'a': [1], 'b': [1.1]})).dtypes
# a      int64
# b    float64
# dtype: object
```