ENH: Implement Distribution framework

Distribution objects perform computations for stochastic (or exponential
family) nodes. Computations are thus separated from the node, allowing
easier use of, for instance, Mixture nodes. Also, some simple function
wrappers of nodes could be removed, for instance, GaussianArrayARD
could be the class for the node instead of a function which creates
the node class in a complicated manner.