Offsets Roundup
Confusion about offsets with `Period`.  AFAICT the underlying issue is that DateOffset are for the most part intended to be used with `date_range` and its just a coincidence that some of them work with `Period`.
- [ ] #4591 Unclear documentation for Period Construction
- [ ] #5091 Missing Periods for some DateOffsets
- [ ] #12379 No str for FY5253Quarter
- [ ] #4878 Issues Creating Period with DateOffset as freq, e.g. `pd.Period('2013-12', freq='pd.offsets.BusinessMonthEnd())` raises

Unanchored Offsets
- [ ] The docstrings/comments don't actually say what "isAnchored()` is supposed to mean.  There is some explanation https://pandas.pydata.org/pandas-docs/stable/timeseries.html#anchored-offsets
- [ ] #15685 Request for unanchored YearOffset
- [x] #7706 YearOffset() raises AttributeError
- [x] #4804 BUG: seems that subtracting a YearBegin offset from an index loses the months/days

Quarter start/end offset confusion
- [ ] #17787 Anchored offset Starting Quarter and Year defaults to JAN not DEC
- [x] #2885 Default for "Q" is not the same as default for "QuarterEnd"
- [ ] #5307 Parameter Name of startingMonth for QuarterEnd is Misleading
- [ ] #18235 Quarter.onOffset looks fishy
- [ ] #8435 DEPR: QuarterBegin and BQuarterBegin return days that are not quarter beginnings

Timezone issues
- [x] #12156 Adding DateOffset(days=1) produces NonExistentTimeError, given example is `pd.date_range(pd.Timestamp('2015-1-1', tz='US/Eastern'), pd.Timestamp('2016-1-1', tz='US/Eastern'), freq='H') + pd.DateOffset(days=1)`
- [x] #16980 API: Wrong DateOffset behaviour with DST changes.  I think the OP wants `Day` to behave like `relativedelta(days=1)` rather than `timedelta(hours=24)`
- [ ] Lots of errors surfaced when running tests with hypothesis in #18761

RelativeDelta issues.  Some of these may be solved or affected by #18329, #18226
- [ ] #7418 BUG: hour/hours (and other plurals) should be the same as singulars.  DateOffset behavior here just passes through to `dateutil.relativedelta`, so the issue seems to be confusingly similar kwarg options.
- [x] #7707 MonthOffset() gives increase of 1 day instead of 1 month (This raises ``NotImplementedError``)
- [x] #4804 goes here too

Perf
- [x] `DateOffset.__eq__`  (called from `Period.__eq__`) is very slow because `DateOffset._params` is very slow.  This could be improved a _lot_ if `DateOffset` were immutable.  Attempts to do this so far have run into pickle problems, see #18224.  Assistance requested.

Possible Bugs, needs confirmation:
- [x] #18510 Week(weekday=None).onOffset will always return False, while I think it should always be True. (Closed by #18875)
- [x] A bunch of offsets fail to satisfy `offset.onOffset(ts)` \Leftrigharrow `(ts + offset) - offset == ts`.  I _think_ the latter is effectively the definition of `onOffset` in the general case, need confirmation that this is a bug.

Misc
- [x] #12724 BUG: Cannot add non-vectorized DateOffset to empty DatetimeIndex
- [x] `normalize` should be accounted for in `__eq__` (#17689) (closed by #21404)
- [x]  Do `Tick` classes with `normalize=True` make sense? (#21434)
- [x] `CacheableOffset` mixin is never used
- [x] liboffsets.WeekDay is not used outside of tests
- [x] DateOffset._should_cache is never true
- [ ] DateOffset.isAnchored needs a docstring
- [ ] I screwed up a while back confusing `BusinessMixin.offset` with `DateOffset._offset`.  No real harm done, but should be reverted.  Might be worth finding a different name than `offset`
- [ ] `BusinessHourMixin.apply` raises an `ApplyTypeError` with an incomplete error message
- [ ] remove camelCase
- [ ] WeekOfMonth._from_name has a comment `# TODO: handle n here...`, same with `LastWeekOfMonth`
- [ ] `BQuarterBegin` has a comment `# I suspect this is wrong for *all* of them`, could really use some clarification.
- [ ] `YearOffset._get_offset_day` has a comment suggesting a more performant implementation may be available.
- [ ] `FY5253.apply` has a couple of `assert False` statements for cases which presumably we don't expect to get hit.  These should probably raise with a useful error message (or better yet, confirm that they will never get reached.
- [x] Does Tick need its own `apply_index`?
- [ ] Easter.apply handles `n==0` differently from all others.
- [ ] #8386 missing comparison methods (#18738 should close this)
  