Fix blocksparse optimization that could give bad results in some cases

This changes the way "inplace" optimization for SparseBlock{Gemv,Outer}SS works.  It makes it much safer for unusual graphs and add support for add along with sub.

However due to these changes, it makes avoiding the Alloc the responsability of other optimizations (local_alloc_elemwise), which are not enabled by default and are highly recommended.  Use the flag `optimizer_including=local_alloc_elemwise` to enable it.
Yes. I'm not sure exactly how to test this since I never had any actual test case.  It was found through semantic analysis I did when I worked with Dustin a while back.  As far as I know nobody ever encountered that particular problem since the structure it requires to show up is just not created by the grad function.  But it's still a possibility.

grab_ger is looking for a ger (SparseBlockOuterSS is a ger).

I need to keep the cuda_available test since opt is not imported if it's False.