Drastically improved Random monad.

This commit adds trampolining. Previously, if you chained too many
flatMaps you'd hit a StackOverflowException.

One result is that Random no longer wraps Dist by default (since that
design didn't work well with trampolining) although creating a Random
from a Dist should still be possible. There will certainly be some
duplication/redundancy between Random and Dist... we'll just have to
see how much that ends up being in practice.