Proposal combinators

- Added functions for building proposals that will change subparts of sample
- This is useful in kernel cycles, for instance
- Rewrote the cycling code to make it clearer
- Notes for previous two commits:
  - Changed to mostly procedural representation of Distributions
  - We have Target and Proposal as datatypes
  - Any sampleable distribution implemented by the library will be provided as a Proposal
  - Changed Kernel to be simply a synonym for a Step with a specific Target/Proposal pair
  - Added the ability to have a cycle kernel given appropriate conditional proposals