Abstract over the AST, because I really want it to be a Monad and I think it can be lawful

Signed-off-by: Ricky Elrod <ricky@elrod.me>