ENH: larger fixes for np.delete and np.insert functions

There were several smaller to larger problems for these two functions,
that this addresses:
  * delete did not handle out of bound values graciously (ignoring negative
    ones)
  * both were unnecessarily slow due to use of sets
  * insert did not handle unsorted indices correctly

Further changes:
  * Add FutureWarning for boolean obj, so it can be handled similar to a
    boolean mask with indexing.
  * Add FutureWarning to remove inconsistent special cases for 0-d arrays
    (neither insertion nor deletion along an axis make sense for a scalar)
  * Allow insertion of an array with more then one element along axis when
    obj is a sequence with a single item. (i.e. array([1])).
  * Reintroduce speed optimization for scalar in insert that existed in 1.6.
FIX: insert/delete fixes and warnings for non-integer indices
TST: New tests for insert/delete covering warnings and corner cases
MAINT: np.delete keep old out of bound/negative index behavior
DOC: Fixup of delete/insert changes in release notes
FIX: rename xrange to range in python 2

np.delete abuses range to calculate start/stop/step and len. This
would create potentially large intermediates if it was a list, so
for numpy/lib/function_base.py and python < 3, use range = xrange.