Haskell combinators for constructing contracts

The combinators use HOAS, which is translated into de Bruijn-style
binders using the technique described in "Unembedding Domain-Specific
Languages".