ENH: Type specific binary search functions for `searchsorted`

This PR replaces the generic binary search functions used by `searchsorted`
with type specific ones for numeric types. This results in a speed-up of
calls to `searchsorted` which is highly dependent on the size of the
'haystack' and the 'needle', with typical values for large enough needles
in the 1.5x - 3.0x for direct searches (i.e. without a `sorter` argument)
and 1.2x - 2.0x for indirect searches. A summary benchmark on float and
int arrays can be found [here](https://gist.github.com/jaimefrio/8704101).

Furthermore, the type specific binary search functions can take strided
inputs for all their arguments, which is a step in the right direction to
eventually add an `axis` argument to `searchsorted`.
- Modified resetting of binary search indices when multiple keys are being
  searched, following @juliantaylor's suggestion. This speeds up searches of
  ordered keys by a lot (up to 3x), but slightly slows down purely random
  keys. Some benchmarks are available [here](https://gist.github.com/jaimefrio/8704101#file-gistfile2-txt)
- Added tests for proper handling of the smart index resetting when the last
  key was larger than all items in the searched array.
- Added basic tests for all implemented dtypes.
- This last change unearthed a funny behavior of `PyArray_CheckFromAny`,
  which was changing the byteorder attribute of `NPY_UBYTE` from `NPY_IGNORE`
  to `NPY_NATIVE`, and triggering lots of failures in `np.core.test()`. So I
  modified `PyArray_CheckFromAny` to leave `NPY_IGNORE` byteorders alone.
- Removed the now unused binary search functions from `item_selection.c`.
- Modified generic searches to take a PyArrayObject and use its PyArray_DESCR
  to fetch a compare function, rather than the global state function that
  the sort functions take.
- Added get_genericbinsearch_func and get_genericargbinsearch_func to
  npy_binsearch.h.src, to get a function pointer to the right generic type
  search function. This makes the code in item_selection.c easier to follow,
  I think.
- Littered PyArray_SearchSorted with comments with my ref counts for dtype,
  hopefully I got it right this time.
- Refactored code, to have type specific and generic binary search functions
  share signature. `get_(arg)binsearch_func` now handles finding the right
  function for all cases, making it transparent to `PyArray_SearchSorted`.
- Reordered types in `(arg)binsearch_map` to be sorted by type num. Since
  the function is searched using binary search, this is a requirement. Only
  `npy_half` was out of place. Added comment to remind future expansions.
- Corrected reference counting for `dtype` in `PyArray_SearchSorted`.
- The requirement for a coniguous `sorter` array had been dropped, but the
  stride for it was set to the element size. This created an opportunity for
  a very unlikely bug, that is now corrected. Added test to verify it.
- Removed unused includes from `binsearch.c.src` and `npy_binsearch.h.src`.
- initialize `last_key_val` to first value in `key` to avoid compiler warnings.
- removed unused `store_arr` variable from `PyArray_SearchSorted`.
STY: adapted code to `C_STYLE_GUIDE.rst.txt`
MAINT: Added `NPY_VISIBILITY_HIDDEN` to binary search functions in
       `binsearch.c.src` and `npy_binsearch.h.src`.
MANT: Minor style corrections, `get_(arg)binsearch_func` is no longer inline.
DOC: Added note on `doc/release/1.9.0-notes.rst`
Merge pull request #4244 from jaimefrio/binsearch

ENH: Type specific binary search functions for `searchsorted`