Initial implementation of high-level interface

This includes #25 but will be rebased.

We should have a 'high-level' function that can take many different kinds of input and understand them, and this is a first stab at it.