ENH Refactor and speed up CSR fancy indexing
FIX correctly handle dense return from csr_matrix.__getitem__
ENH more efficient CSR __setitem__
ENH use np.unique instead of groupby
FIX various logic errors in __setitem__
Avoid using np.take(x,x); use mode='clip'
TST: sparse: add a benchmark for sparse __setitem__ and __getitem__
ENH support CSR/CSC __setitem__ where duplicates interfere

Also use izip instead of zip
Merge pull request #3233 from jnothman/fancy_csr_index

ENH: sparse: Refactor and speed up sparse fancy indexing

The incumbent implementation of fancy indexing in csr_matrix (and
indirectly csc_matrix) relies on Python iteration in the general case
for __getitem__ and all cases for __setitem__. However, the general get
case can be refactored with a handled specific case to use only
vectorized iteration. The set case can easily be done quickly when the
sparsity is not changed.
TST: sparse: enable sparse non-canonical format tests that pass now