Probability functions use scipy.stats

This way we directly use the scipy.stats package's probability
functions, and a base class lets us call probabilities or get random
samples. We can't use naked scipy.stats random variables because we want
to provide limits where -np.inf is returned for samples that exceed the
limits.