SE-0251: SIMD Additions

This requires blowing up the index vector for dynamic permutes (table lookups). For some vector code (e.g. a lot of string operations) that's more common than static swizzles, and this would make it much less ergonomic. The SIMD3<T> weirdness is mildly annoying to define, but I don't think will be an issue at all in practice--one simply doesn't use 3-element dictionaries for permutes. We could alternatively simply define the index to be modulo dictionary size; that would make the 3-element dictionary case slower, but as I said, I don't think that case really matters--we just need to pick something and define it.

There's also a crowd that wants these to be super-terse and as close to the clang-style v.xxyz as possible. What you sketched out doesn't allow for a terser style, while the SIMD subscript lets you do:

let xxyz = SIMD4(0,0,1,2)

and then use that repeatedly as v[xxyz], which is really pretty nice. I don't think we need to put the whims of the "terseness above all" crowd first, but it's nice that this form lets you be more or less expressive as needed.

We could also wrap that in some compilerEvaluable + dynamicMemberLookup at some future point to actually allow v.xxyz if we wanted to.