WIP/API/ENH: IntervalIndex
closes #7640 
closes #8625

This is a work in progress, but it's far enough along that I'd love to get
some feedback.

TODOs (more called out in the code):
- [ ] documentation
- [x] docstrings
- [x] implement an IntervalTree under the hood to handle index methods
- [x] index methods handle point queries properly:
  - [x] `get_loc`
  - [x] `get_indexer`
  - [x] `slice_locs`
- [x] index methods handle interval queries properly
  - [x] `get_loc`
  - [x] `get_indexer` (for non-overlapping monotonic indexes)
- [x] comparison operations (should be lexicographic)
- [x] ensure `is_monotonic` always works (also lexicographic)
- [x] ensure `order` works
- [x] cast arrays of intervals when input to `pd.Index`
- [x] cythonize the bottlenecks:
  - [x] `values`
  - [x] `from_intervals`?
  - [x] `Interval`?
  - [ ] `from_tuples`?
- [ ] `Categorical`/`cut`
- [ ] nice to haves (not essential for MVP)
  - [ ] `get_indexer` in full generality (for randomly ordered indexes)
  - [ ] support for arithmetic operations
  - [ ] `MultiIndex` -- should at least give a sane error messages
  - [ ] serialization (HDF5) -- should at least raise `NotImplementedError`
  - [ ] consider creating `interval_range` -- like `period_range`
  - [ ] add `to_interval` for casting strings (e.g., `to_interval('(0, 1]')`)
  - [ ] release the GIL in IntervalTree queries
- [ ] loads more tests:
  - [x] `Series.loc.__getitem__`
  - [ ] `Series.loc.__setitem__`
  - [ ] indexing a dataframe
  - [ ] groupby
  - [x] reset_index
  - [x] add tests in test_index for the subcommon API

CC @jreback @cpcloud @immerrr
