the parser consists of two major contexts: the expression and the block.
expressions define a sequence of operations that produce a value, while blocks
are capable of binding expressions to identifiers and disrupting control flow.
an espy program should be interpreted as a "block" at its top level.
block parsing is "infallible"; instead of returning `Result` types, most ast
nodes contain "diagnostics" fields to collect errors without giving up on
parsing.