BUG/API: make setitem-inplace preserve dtype when possible with PandasArray, IntegerArray, FloatingArray
- [ ] closes #xxxx
- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them
- [ ] whatsnew entry

xref #38896 (doesn't close).  In general `df[:, "A"] = foo` tries to operate in-place before falling back to casting.  This makes sure we do that when `foo` is a `PandasArray`, `IntegerArray`, or `FloatingArray`

I guess could/should do the same for BooleanArray
