ENH: RangeIndex redux
closes #939 
replaces #9977 

ToDo:
- [x] test for packers.py
- [x] more code review

Much commentary on the original issue #9977 

but in essence `RangeIndex` is a complete replacement for `Int64Index`, which all indexing semantics and interop. This is now the default indexer upon construction. It should be completely transparent to the end user.

It provides a constant memory footprint for any size of index. Their is a tiny penalty for < about 10 elements (which is actually trivial to fix, e.g. we could simply instantiate an `Int64Index` for these cases). But I think it is more natural to _always_ get a `RangeIndex`.

One other change here is to `assert_index_equal` the `exact` kw now takes `equiv` as the default (in addition to a boolean) to allow for exact comparisions except for `Int64Index`/`RangeIndex` are considered equivalent (as are string/unicode as inferred types, this was pre-existing).

```
In [1]: s = Series(range(5))

In [2]: s.index
Out[2]: RangeIndex(start=0, stop=5, step=1)

In [3]: s.nbytes
Out[3]: 40

In [4]: s.index.nbytes
Out[4]: 72

In [5]: s.index.astype(int).nbytes
Out[5]: 40

In [6]: s = Series(range(100))

In [7]: s.index.astype(int).nbytes
Out[7]: 800

In [8]: s.index.nbytes
Out[8]: 72
```
