Add a blocksparse multiplication implementation

This is a first step, it may still need more work.
We only use that memory in a GPU kernel, right? Since the kernel is called after the copy is launched, it will still be executed after the copy finishes, even if both call return immediately.