implement shift_quarters --> apply_index for quarters and years
`tslibs.offsets.shift_quarters` should look like the the lovechild of `offsets.shift_months` and `QuarterOffset.apply`.  It may be possible to de-duplicate some of that* at some point.

We get `apply_index` methods for all four `YearOffset` subclasses and all four `QuarterOffset` subclasses.  (Previously there were implementations for the non-business versions, but they went through a code path that I found fragile).  `BeginMixin` is no longer used, removed.

All 12 of the (non-custom) Month+Quarter+Year offset subclasses are now parametrized stubs with the actual implementations unified in parent classes.

Small cleanups and notes in offsets.

\* It would be convenient to be able to specify a function to accept either a `datetime` or a `pandas_datetimestruct` in cases where they quack alike.  I tried to do a `ctypedef fused datetimelike` but cython objected.  Any thoughts?

```
asv continuous -f 1.1 -E virtualenv master HEAD -b offset
[...]
       before           after         ratio
     [262e8ff3]       [21504bfd]
-      18.4±0.9μs      16.7±0.06μs     0.91  offset.CBDay.time_custom_bday_apply_dt64
-        519±20ms        458±0.3ms     0.88  offset.SemiMonthOffset.time_end_apply_index
-        77.7±6ms      67.7±0.09ms     0.87  timeseries.ToDatetime.time_cache_false_with_dup_string_tzoffset_dates
-        542±20ms          459±2ms     0.85  offset.SemiMonthOffset.time_begin_incr_rng
-         209±3μs        132±0.2μs     0.63  offset.CBMonthBegin.time_custom_bmonthbegin_incr_n
-      21.5±0.1ms         6.82±1ms     0.32  offset.ApplyIndex.time_apply_series(<YearBegin: month=1>)
-      23.4±0.6ms      6.82±0.09ms     0.29  offset.ApplyIndex.time_apply_series(<QuarterBegin: startingMonth=3>)
-      22.0±0.5ms      5.17±0.09ms     0.23  offset.ApplyIndex.time_apply_index(<QuarterBegin: startingMonth=3>)
-      19.8±0.4ms       4.64±0.1ms     0.23  offset.ApplyIndex.time_apply_index(<YearBegin: month=1>)
-         487±1ms      8.13±0.06ms     0.02  offset.ApplyIndex.time_apply_series(<YearEnd: month=12>)
-        502±20ms      7.14±0.07ms     0.01  offset.ApplyIndex.time_apply_series(<QuarterEnd: startingMonth=3>)
-       494±0.4ms       6.02±0.2ms     0.01  offset.ApplyIndex.time_apply_index(<YearEnd: month=12>)
-        555±20ms       5.64±0.2ms     0.01  offset.ApplyIndex.time_apply_index(<QuarterEnd: startingMonth=3>)
-           1.52s         11.3±1ms     0.01  offset.ApplyIndex.time_apply_series(<BusinessYearEnd: month=12>)
-           1.41s       8.17±0.2ms     0.01  offset.ApplyIndex.time_apply_series(<BusinessYearBegin: month=1>)
-           1.82s       10.0±0.2ms     0.01  offset.ApplyIndex.time_apply_series(<BusinessQuarterEnd: startingMonth=3>)
-           1.47s       8.07±0.6ms     0.01  offset.ApplyIndex.time_apply_index(<BusinessQuarterEnd: startingMonth=3>)
-           1.57s       8.49±0.2ms     0.01  offset.ApplyIndex.time_apply_series(<BusinessQuarterBegin: startingMonth=3>)
-           1.66s      8.35±0.09ms     0.01  offset.ApplyIndex.time_apply_index(<BusinessYearEnd: month=12>)
-           1.53s       6.51±0.1ms     0.00  offset.ApplyIndex.time_apply_index(<BusinessQuarterBegin: startingMonth=3>)
-           1.63s      6.21±0.06ms     0.00  offset.ApplyIndex.time_apply_index(<BusinessYearBegin: month=1>)
```

Running a larger version now.

- [ ] closes #xxxx
- [x] tests added / passed --> apply_index for all relevant classes, make sure to hit negative n
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry
