PERF: Make DateOffset (partially) immutable, cache _params for __eq__ speedup
Any time two `pd.Period` objects are compared, it starts off by checking `self.freq != other.freq`.  These `freq` attributes are `DateOffset` objects defined in `tseries.offsets`.  `DateOffset.__ne__` calls `self._params()`, which is the bottleneck in a lot of Period-based work.

```
import pandas as pd
import cProfile, pstats
nobs = 2000
dr = pd.date_range('1901-01-01', freq='M', periods=nobs)
ser = dr.to_series().apply(pd.Period, freq='M')
pr = cProfile.Profile()
pr.enable()
fr = ser.to_frame().set_index(0, append=True)
pr.disable()
p = pstats.Stats(pr)
p.sort_stats('cumulative')
p.print_stats(20)
```

Results under the status quo:
```
         340859 function calls (340834 primitive calls) in 1.564 seconds

   Ordered by: cumulative time
   List reduced from 279 to 28 due to restriction <0.1>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.562    1.562 /usr/local/lib/python2.7/site-packages/pandas/core/frame.py:2761(set_index)
        1    0.000    0.000    1.555    1.555 /usr/local/lib/python2.7/site-packages/pandas/core/indexes/multi.py:1059(from_arrays)
        1    0.000    0.000    1.555    1.555 /usr/local/lib/python2.7/site-packages/pandas/core/categorical.py:2171(_factorize_from_iterables)
        2    0.000    0.000    1.555    0.777 /usr/local/lib/python2.7/site-packages/pandas/core/categorical.py:2134(_factorize_from_iterable)
        2    0.000    0.000    1.555    0.777 /usr/local/lib/python2.7/site-packages/pandas/core/categorical.py:251(__init__)
        2    0.001    0.001    1.543    0.772 /usr/local/lib/python2.7/site-packages/pandas/core/algorithms.py:527(factorize)
    20013    0.037    0.000    1.453    0.000 /usr/local/lib/python2.7/site-packages/pandas/tseries/offsets.py:374(__ne__)
    20013    0.143    0.000    1.417    0.000 /usr/local/lib/python2.7/site-packages/pandas/tseries/offsets.py:360(__eq__)
        2    0.000    0.000    1.381    0.691 /usr/local/lib/python2.7/site-packages/pandas/core/algorithms.py:429(safe_sort)
        2    0.053    0.026    1.381    0.690 {method 'argsort' of 'numpy.ndarray' objects}
    40026    1.029    0.000    1.240    0.000 /usr/local/lib/python2.7/site-packages/pandas/tseries/offsets.py:311(_params)
        1    0.016    0.016    0.157    0.157 {method 'get_labels' of 'pandas._libs.hashtable.PyObjectHashTable' objects}
    40026    0.102    0.000    0.102    0.000 {sorted}
   120079    0.074    0.000    0.074    0.000 {method 'items' of 'dict' objects}
    40026    0.036    0.000    0.036    0.000 {vars}
    40431    0.034    0.000    0.034    0.000 {isinstance}
     9578    0.017    0.000    0.022    0.000 /usr/local/lib/python2.7/site-packages/pandas/tseries/offsets.py:495(freqstr)
        2    0.000    0.000    0.011    0.005 /usr/local/lib/python2.7/site-packages/pandas/core/categorical.py:543(_validate_categories)
        1    0.000    0.000    0.010    0.010 /usr/local/lib/python2.7/site-packages/pandas/core/indexes/base.py:152(__new__)
        1    0.000    0.000    0.009    0.009 /usr/local/lib/python2.7/site-packages/pandas/core/indexes/period.py:202(__new__)
```

Results under this PR:
```
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.141    0.141 pandas/core/frame.py:2862(set_index)
        1    0.000    0.000    0.139    0.139 pandas/core/indexes/multi.py:1054(from_arrays)
        1    0.000    0.000    0.139    0.139 pandas/core/categorical.py:2146(_factorize_from_iterables)
        2    0.000    0.000    0.139    0.069 pandas/core/categorical.py:2109(_factorize_from_iterable)
        2    0.000    0.000    0.139    0.069 pandas/core/categorical.py:251(__init__)
        2    0.000    0.000    0.132    0.066 pandas/core/algorithms.py:441(factorize)
    20013    0.012    0.000    0.098    0.000 pandas/tseries/offsets.py:383(__ne__)
    20013    0.036    0.000    0.086    0.000 pandas/tseries/offsets.py:369(__eq__)
        1    0.008    0.008    0.068    0.068 {method 'get_labels' of 'pandas._libs.hashtable.PyObjectHashTable' objects}
        2    0.000    0.000    0.063    0.031 pandas/core/sorting.py:383(safe_sort)
        2    0.016    0.008    0.063    0.031 {method 'argsort' of 'numpy.ndarray' objects}
     2000    0.030    0.000    0.035    0.000 pandas/tseries/offsets.py:319(_params)
     9578    0.009    0.000    0.012    0.000 pandas/tseries/offsets.py:504(freqstr)
    40456    0.011    0.000    0.011    0.000 {isinstance}
        2    0.000    0.000    0.006    0.003 pandas/core/categorical.py:544(_validate_categories)
        1    0.000    0.000    0.006    0.006 pandas/core/indexes/base.py:154(__new__)
        1    0.000    0.000    0.006    0.006 pandas/core/indexes/period.py:194(__new__)
        1    0.002    0.002    0.005    0.005 {pandas._libs.period.extract_ordinals}
     2000    0.004    0.000    0.004    0.000 pandas/tseries/offsets.py:193(__setattr__)
     9578    0.003    0.000    0.003    0.000 pandas/tseries/offsets.py:500(rule_code)
```

Note that in this example the periods were _already_ ordered, so the number of comparisons (20013) is pretty much best-case.  After shuffling them (sample size=1) there were 35181 comparisons.

There are some things I'd like to touch up to move towards actual-immutability, but the caching here is a big win.