Cleaned up the interface a bit.

Now instead of having InvalidExpression and InvalidLocation, we use Maybe
Location and Maybe Expression. This allows us to use the do construct in eval
which decreases the overhead for new opcodes and generally makes the code more
readable.