Rewrote Split() to use new SampleReduce() and Derive()

A squash of 5 commits.