The Design and Implementation of Probabilistic Programming Languages