Split VectorizedScorer into ValueScorer + DataScorer

This splits `VectorizedScorer` into `MixtureValueScorer` + `MixtureDataScorer`, and creates in each model two typedefs: `FastMixture` and `SmallMixture`. Both mixture types use a fast custom `.score_data(...)` method, but only `FastMixture` has uses caching in its `score_value` method.

This also moves towards @cap 's suggested pattern of splitting complicated objects into pieces: `MixtureSlave` is now composed of `MixtureSlaveGroups` + `MixtureSlaveValueScorer` + `MixtureSlaveDataScorer`.

Practically, this speeds up loom inference by 15-30%.