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 this is looking for a Block left behind by unrolling. I'm not confident that the first node in the block isn't a LetStmt though, and if there are LetStmts, they might need to be converted into Let expressions so that the stores can be interleaved, but that's only legal if the LetStmts only contain a Store....

I think this store aggregator needs a rethink. One possible approach is unwrapping the block like so:

Block *block = op;
while (block) {
  // Peel off lets
  LetStmt *let = block->first.as<LetStmt>();
  Store *store = block->first.as<Store>();
  while (let) {
    .... dump the expr and name into a vector<string, Expr>
    let = let->body.as<LetStmt>();
    store = let->body.as<Store>();
  }
  
  if (!store) bail out (e.g. we hit a for loop)

  // Now we have a store and a bunch of lets. 
  // Check if the store has a compatible stride and maybe bail out.
  // Check if the store contains any loads to the same buffer and maybe bail out.
  // Wrap the store value in Let exprs equivalent to the LetStmts and save the resulting expr

  block = block->rest.as<Block>();
}

If everything worked out, interleave all the exprs we extracted and make one store node.