vertexcodec: Use sentinel value to indicate separately stored data
vertexcodec: Use sentinel value to indicate separately stored data

When each group of 16 values is constrained to the same bit length, one
outlier forces us to unpack the entire group. This makes prediction
errors very costly, thus wasting a lot of bits.

We could have a special encoding where a bitmask is used to select
outliers, and switch between that and the general encoding per group.
However, we note that the range we're using for deltas is inconveniently
asymmetric anyway, and pick the minimum negative value (1..1 after zigzag)
to represent outliers.

Since it's not clear which width to use, just test all widths; we
currently re-encode for each test which is somewhat excessive but
simple.

This change significantly improves the resulting size pre-deflate and
marginally improves post-deflate sizes as well:

kitten.obj, before: 52.4 bpv base, 43.4 bpv deflate
kitten.obj, after: 46.3 bpv base, 42.5 bpv deflate

nyra.obj, before: 78.1 bpv base, 64.4 bpv deflate
nyra.obj, after: 71.0 bpv base, 64.4 bpv deflate

zeuxcg.obj, before: 81.0 bpv base, 62.7 bpv deflate
zeuxcg.obj, after: 68.1 bpv base, 61.9 bpv deflate

zeux/meshoptimizer,zeux/meshoptimizer,zeux/meshoptimizer