REF: separate indexer utilities from indexing.py
A couple things going on here.

- Take simple, low-dependency, not-used-in-indexing.py functions out of indexing.py and put them in indexers.py.
  - A couple of runtime-defined functions in internals get moved here too.
  - Avoids some runtime imports (i.e. simplify dependency structure)
  - Fixes some incorrect private names
  - Adds typing
- Simplify some indexing.py methods
  - Avoid duplicated validation calls
  - Add typing
  - De-duplicate _get_slice_axis method
  - Move code outside of try/except blocks to clarify what the failure modes are.

Medium-term goals in indexing.py
  - Isolate internals access
  - refactor _setitem_with_indexer (over 300 lines)
note as a post or pre-cursor to this I would form pandas/core/indexing/ and move indexing.py (and indexers.py) there as well > note as a post or pre-cursor to this I would form pandas/core/indexing/ and move indexing.py (and indexers.py) there as well

Sure.  Obvious preference for post-cursor. Hello @jbrockmendel! Thanks for updating this PR. We checked the lines you've touched for [PEP 8](https://www.python.org/dev/peps/pep-0008) issues, and found:

















There are currently no PEP 8 issues detected in this Pull Request. Cheers! :beers: 

##### Comment last updated at 2019-07-08 13:51:16 UTC Added one more docstring, left un-docstringed is_scalar_indexer and is_empty_indexer because I'm not totally clear on what those functions are doing (possibly an extra indentation in is_scalar_indexer?  it is _almost_ identical to the last 5 lines of is_empty_indexer)

Added a note about InvalidIndexError being for geopandas. thanks. in followups we need to move / consolidate these things; also a typing pass would be helpful.