Added Cauchy distribution
Adding an alternative implementation using protocols

It is easier to add new distributions this way. The code is much
cleaner so far.
Added normal and exponential distributions
Added ability to generate a sample given a predicate
Added implementations to each distribution
Added discrete uniform distribution