REF: implement _should_compare
- [ ] closes #xxxx
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

Index._is_comparable_dtype is limited because it misses a few cases: object dtype, and sub-dtypes within categorical.  This implements Indes._should_compare, which handles those correctly.  It then implements `_get_indexer_non_comparable` for cases in which we short-circuit non-comparable dtypes.

As a proof of concept, this then uses _should_compare and _get_indexer_non_comparable for `PeriodIndex.get_indexer`.

The behavior change, which this tests, is one that IIUC is a bug.  That is, when we do get_indexer with a method and non-comparable dtypes, we should raise instead of return all minus-ones.

If implemented, we'll be able to use _should_compare to simplify all of the get_indexer, get_indexer_non_unique, and set op methods.
> i don't think this method should raise.

> this is a pretty big change from status quo

I stumbled onto this in part because of this test:

```
def test_reindex_datetimeindexes_tz_naive_and_aware():
    # GH 8306
    idx = date_range("20131101", tz="America/Chicago", periods=7)
    newidx = date_range("20131103", periods=10, freq="H")
    s = Series(range(7), index=idx)
    msg = "Cannot compare tz-naive and tz-aware timestamps"
    with pytest.raises(TypeError, match=msg):
        s.reindex(newidx, method="ffill")
```

and i figured that the way we treat periods with mismatched freq is almost identical to how we treat tzawareness-compat.  Or is dt64tz special in this case?

I'd be OK with not-raising in _get_indexer_non_comparable, just want to get this behavior consistent, bc ATM we're all over the place. xref #36320 So I'm increasingly convinced that the current PeriodIndex.get_indexer behavior with method != None is wrong:

```
dti = pd.date_range("2016-01-01", periods=3)
pi = dti.to_period("D")
pi2 = dti.to_period("W")

ser = pd.Series(range(3), pi)

>>> ser.reindex(pi2, method="ffill")
2015-12-28/2016-01-03   NaN
2015-12-28/2016-01-03   NaN
2015-12-28/2016-01-03   NaN
Freq: W-SUN, dtype: float64
```

But pi vs pi2 are uncomparable just like pi vs dti, so we should raise the same way:

```
>>> ser.reindex(dti, method="ffill")
[...]
  File "pandas/_libs/algos.pyx", line 450, in pandas._libs.algos.pad
    if nleft == 0 or nright == 0 or new[nright - 1] < old[0]:
TypeError: '<' not supported between instances of 'Timestamp' and 'Period'
``` alright!  get ready to see a bunch of de-duplication and fastpaths coming in. hit me!