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.
It's not exactly documented, no but at the same time it is also a local function only used in those optimization.  I can rename it but it feels a lot like bikeshedding.