Rebalanced the splits tree to make the outermost split first.

For example:

f.vectorize(x, 8).unroll(x, 2);

which was sugar for:

f.split(x, x, x1, 8).split(x, x, x2, 2).vectorize(x1).unroll(x2)

now gets normalized to:

f.split(x, x, x3, 16).split(x3, x2, x1, 8).vectorize(x1).unroll(x2)

or more tersely:

f.split(x, x, xi, 16).vectorize(xi, 8).unroll(xi)

This means that the min-clamping behavior for the last chunk of a split now
only applies to the single outermost split instead of potentially many.
When it applied to many, sometimes vector code was getting badly scalarized,
e.g. if you unroll then vectorize.

It also means that the minimum realization size is the product of the split
factors. I'm not sure what it was previously, but it may have been the sum
if the split tree was balanced so that all splits split the outer dimension
of the previous split.