Initial implementation of struct-type contract generation.

It has to take a list because that's how the `combinator` struct expects `args` to be.