API/CLN: add in common operations to Series/Index, refactored as a OpsMixin

closes #4551
closes #4056
closes #5519

allow a Series to utilize index methods for its index type, e.g. ``Series.year`` is now defined
  for a Series with a ``DatetimeIndex`` or a ``PeriodIndex``; trying this on an Index type will
  now raise a ``TypeError``. The following properties are affected:
  ``date,time,year,month,day,hour,minute,second,weekofyear``
  ``week,dayofweek,dayofyear,quarter,microsecond,nanosecond,qyear``
  and methods: ``min(),max()``,
 

```
In [1]: s = Series(np.random.randn(5),index=tm.makeDateIndex(5))

In [2]: s
Out[2]: 
2000-01-03   -0.301523
2000-01-04    1.104868
2000-01-05    0.321592
2000-01-06   -0.565114
2000-01-07    0.888334
Freq: B, dtype: float64

In [3]: s.year
Out[3]: 
2000-01-03    2000
2000-01-04    2000
2000-01-05    2000
2000-01-06    2000
2000-01-07    2000
Freq: B, dtype: int64

In [4]: s.index.year
Out[4]: Int64Index([2000, 2000, 2000, 2000, 2000], dtype='int64')

In [5]: Series(np.random.randn(5)).year
TypeError: cannot perform an year operations on this type <class 'pandas.core.index.Int64Index'>
```