API: allow negative steps for label-based indexing

This should fix #8716.

This is still work-in-progress, but some of its refactoring may be useful for #8613, so I'd like someone to look through this.

cc'ing @shoyer, @jreback and @jorisvandenbossche .

TODO:
- [ ] fix datetime/period indices
- [ ] fix multiindex
- [ ] add tests for specific indexers
Side note: how can we end up here? Were these methods intended to work with array arguments? If so, that definitely is not the case anymore:
```
>>> idx = pd.Index(range(100))
>>> idx.slice_locs(np.array([0, 5]), np.array([3, 8]))
TypeError
```