Implement PeriodIndex.difference without object-dtype cast
Analogous to #30666.  After this we'll be able to share some code between the set operations.

The edit in pd._testing is mostly unrelated.  Both are motivated by tracking down the places where object-dtype ndarray is passed to PeriodIndex._shallow_copy.
lgtm ping on green. thanks