PLAT-3538 - Redesign of randomizing provider and snapshot

Snapshot is now an inner class of the provider because they need to
share state. The randomizer needs to be in the provider so it can
publish notifications but needs to know about the data in the snapshot.