Generalizing the Kernel library over distribution type

- Kernels can be defined for proposals and targets over arbitary types
- Default implementations are provided for nsteps and walk
  - This means that the type of the input and output of the Kernel must
    be a parameter in the Kernel class
- SimulatedAnnealing and Mixture definitions added
- A simulated annealing test case added