PDEP6 implementation pt 1: block.setitem, block.putmask
This is pt 1. More changes would be needed to fully complete PDEP6 (`eablock.setitem` and `eablock.putmask` for a start), but I'd suggest that we do this in stages. This PR is already pretty big

some of this can be factored out, I'll do that first

pt2: https://github.com/pandas-dev/pandas/pull/53405
@jbrockmendel gentle ping, just to ask if you think this would be the right direction / the right place to raise the warning. I think there would need to be at least 4 such PRs to address the initial scope of PDEP6 > the right place to raise the warning

Looks right to me 🤔 this is still raising a warning for
```python
s = pd.Series([1, 2, 3])
s.update(pd.Series([4, np.nan, 6]))
print(s)
```
, looking into it

EDIT: done! yeah I've factored out into separate PRs what I could, but I'll see if I can do more > Do we have tests where this will warn when setting an EA type value?

There's some tests here for when setting an incompatible value raises there: pandas/tests/arrays/masked/test_indexing.py . I'll adapted them for numpy dtypes, thanks 9/21 files viewed!  Getting there... small comments, otherwise LGTM Looks pretty good to me too. 

Should this have a whatsnew note for 2.1? And is it okay if not all of PDEP6 changes don't make it into 2.1? Thanks!

I think ideally this and https://github.com/pandas-dev/pandas/pull/53405 should go together, either both in 2.1 or both in 2.2

Whatsnew - #54014 introduces a section for notable deprecations, shall I add it to that once that's merged?
Or I can add it as part of #53405  Probably best if the whatsnew is added in https://github.com/pandas-dev/pandas/pull/53405 then. Is that PR pretty close? yeah it should be ready, I just need to rebase it after this one - but it doesn't look like there's too many conflicts to resolve fortunately Thanks @MarcoGorelli  nice!