Wip/hmc sampler

There's probably a bunch of non-idiomatic stuff here.  If anything looks weird, let me know and I'll fix it and do a new pull request.
The usual order of preference in error reporting is
- use contracts instead, e.g.  `exact-nonnegative-integer?` for this argument
- use `raise-argument-error` with a string that looks like a contract expression
- if the error is not contract-like (e.g., two list args have different lengths when they should be equal), then use `error` with a symbol (the name of the "complainer"), a format string containing "~e", and the bad values