ENH: allow sparse __mul__ to work with custom types

While implementing a custom sparse matrix class (a fast replacement for `dok_matrix` in Cython/C++), I noticed that there's no way to make a `scipy.sparse` matrix multiply with my type on the right, because `__mul__` was raising a `ValueError` instead of returning `NotImplemented`. I fixed that and included a unit test.