ENH: ExtensionArray support for objects with _can_hold_na=False and relational operators
closes #20659
closes #20761
- [x] tests added / passed
  - New tests/extensions/relobject tests arrays that cannot hold NaN, and has relational operators defined
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry
  - Not added as this is part of the ExtensionArray support coming in the next release, which already has a whatsnew entry

NOTE: I expect that the pandas main developers will object to a lot of what is done here!  So let's be open on the discussion.

## Goals of this pull request:

1. If there is an `ExtensionArray`, allow the relational operators to delegate to the base type
2. Modify `ExtensionArray` tests to handle the cases of `_can_hold_na==False` as best as possible.
3. An eventual goal is that if I have a `RelObjectArray` that consists of objects that have operators such as `__le__` defined that return objects, and `a` and `b` are `Series` containing that type of array, then `a <= b` returns a `Series` of objects rather than booleans.

### Things I'm unsure of:

- In core/ops.py, I am using `inspect` to determine whether the user has implemented the relational operators for the subclassed `ExtensionArray` type as well as for the base type of elements in the array. I'm not sure if this is best practice or not.
- In my example that I'm separately working on, the relational operators (including `__eq__`) return objects as opposed to booleans, and some (intentionally) throw exceptions.  So I tried to catch these various cases.  Not having `__lt__` defined means that sorting is undefined, and not having `__eq__` return a boolean messes up some things related to `groupby`.  For my application, that is OK.
