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.
The change to W is the bugfix? It need a test. Also add a docstring to this opt to show what it change to what.

Also the function grad_ger is a bad name. It don't even look for ger. Can you rename it at the same time?

Also the if at line 617: if cuda_available is useless. In a separate commit, remove it.