compiler: Add planning for vector functions

This adds planning for (vector), (make-vector), (vector-ref) and
(vector-set!). The latter two are quite limited. Both vector access
functions require that the index is a constant integer and that the
length of the vector is known through its type.

(vector-set!) has the additional restriction that it can only work on
allocated values (i.e. not constants). This adds a "knownAllocated" flag
to CellValue that (make-vector) and (vector) set to true that allows
(vector-set!) to know it can safely write to the vector. In practice
this means that (vector-set!) will only be planned inline if it's
immediately initialising a vector that was just allocated.
compiler: SImplify unconditional ForAll IR

(make-vector) now uses ForAll without any loop body condition to allow
early breaks. The IR it generated worked but was a bit silly. Instead
split GenForAll to its own function and have it detect and simplify
loops without an exit condition

With optimisation this should result in the same assembler but it's
easier to read the IR this way.