WIP/API/ENH: IntervalIndex

Fixes #7640, #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 + docstrings
- [ ] finish the index methods:
   - [ ] `get_loc`
   - [ ] `get_indexer`
   - [ ] `slice_locs`
- [ ] comparison operations
- [ ] fix `is_monotonic` (pending #8680)
- [ ] ensure sorting works
- [ ] arithmetic operations (not essential for MVP)
- [ ] cythonize the bottlenecks:
   - [ ] `from_intervals`
   - [ ] `_data`
   - [ ] `Interval`?
- [ ] `MultiIndex`
- [ ] `Categorical`/`cut`
- [ ] serialization
- [ ] lots more tests

CC @jreback @cpcloud @immerrr
So the reason why I didn't use `_simple_new` is because (right now) `_data` is only calculated on demand -- `left`/`right` the inherent/default storage mechanism for this index. I suppose that will be less of a barrier when optimized, but making an object array of `Interval` scalars is not free even if it's all done in Cython, and for many operations the object array may not even be necessary (depends on some details the operations I haven't flushed out yet).