Fix offset __inits__, apply_index dtypes
This PR does two main things:

1) Change the default kwargs for offset `__init__` methods so that the defaults are valid; ATM `WeekOfMonth()` and `LastWeekOfMonth()` will both raise  `ValueError`.

2) ATM `Week.apply_index` adds an int64 array to a `DatetimeIndex`.  This happens to have the desired output because the int64 array represents nanoseconds.  This explicitly casts the array to `timedelta64[ns]` to make this explicit.  <b>This is a necessary step towards fixing #19123.</b>

In addition there are two small pieces of refactoring:

3) Remove `liboffsets.EndMixin` since it is only mixed in to `Week`.

4) Use `liboffsets.roll_convention` to de-duplicate some code in `liboffsets.shift_months`.


- [ ] closes #xxxx
- [ ] tests added / passed
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry
