Consolidate descriptor handling in checkmember.py (#18831)
This is not a pure refactoring, but almost. Right now we are in a weird
situation where we have two inconsistencies:
* `__set__()` is handled in `checker.py` while `__get__()` is handled in
`checkmember.py`
* rules for when to use binder are slightly different between
descriptors and settable properties.
This PR fixes these two things. As a nice bonus we should get free
support for unions in `__set__()`.