InputOp and OutputOp interfaces

This essentially splits the `Function` interface in half, in an attempt to address issue #26.