Probabilistic programming with programmable inference