AST, Bytecode, and the Space In Between: An Exploration of Interpreter Design Tradeoffs