ENH: np.delete speed and robustness improvements

Make np.delete(a, obj) inverse of a[obj] and improve speed.
Slightly changes its behavior for booleans and out of bound
values and fixes negative steps and indices.
TST: Tests for np.delete
MNT: Small changes in delete and documentation.
ENH: Generalize and speed up insert behavior

This fixes that insert fails for negative or unsorted strides
and makes insert(a, [0], [1,2]) work like insert(a, 0, [1,2]).
It also allows boolean indices and consistently raises an error
if obj.ndim>1.
BUG: Fix scalar handleing for insert and small bug with bools

This makes scalar handeling compatible with 1.6 while retaining
the generalizations that were introduced in 1.7 and extending
them a little. Also fixes typo in boolean indices and adds tests
for all these cases.

Also some maintanence and fixing of boolean indices to work exactly
as they do in normal indexing.
DOC: Document changes in np.insert/np.delete more clearly.
quick commit to safe changes. Do not forget about this addition
for the release notes:

The functions np.delete and np.insert now allow boolean arrays just
like indexing and do not convert them to integer indices. np.delete
previously had problems with unsorted `obj` and also flattens `obj` now.
Since 1.7. insert allowed insertion of multiple values if a scalar was
given. This is in a similar manner now also the case if a size one
sequence is given (ie. np.array([1])).