Interleave multiple vectors

This pull request replaces the "Deinterleave powers of 2" request. I have added the ability to interleave an arbitrary number of vectors. We can deinterleave ramp indices that use / or % with constant values up to 4. Additionally, we can detect multiple strided stores in a block and determine if they can be replaced by a single interleaved store. CodeGen_ARM was updated to call the builtin vst instructions for interleaved stores from 1 to 4 vectors. A general purpose interleave_vectors function was added to CodeGen that generates decent llvm code in the general case. 
So I get that I need to deal with the LetStmts correctly, but as per my comment above, doesn't it work to leave all the LetStmts I find before the first Store alone, and then run the StoreCollector, and replace the first Store with the interleaved Store iff all the strides are the same, and the difference of the bases are constant and cover all the indices from 0 to stride-1. If a var in a LetStmt appears in the base of all the stores this could be simplified away when taking the difference and will finally appear again in the interleaved store.