MAINT: pchanial's improvement of input validation in sparse's __mul__

Retry of @pchanial's https://github.com/scipy/scipy/pull/4066, this time with tests and in its own PR branch.  Also changed `raise NotImplemented` to `raise NotImplementedError`.
Not sure about returning NotImplemented here. AFAIK, it's supposed to be
returned if the *type* of the input argument is such that it cannot be
handled, and IIRC results to Python raising a TypeError later on. Here,
however, the type is handled, however partially...