Expression splitting

This introduces a new optimization: assembly splitting. When the assembly expression is "too big for the number of registers available on the machine", it can be split into multiple sub-expressions exploiting sum's associativity and commutativity. 

This is implemented by traversing and manipulating the AST.

Lord knows whether this is going to be re-usable for GPUs as well.

We now also properly check whether the vectorizer has been correctly initialized before emitting code.