(wip) parse app expressions via alternate grammar

The grammar given in the Definition of SML makes a distinction between
the nonterminals `atexp` and `exp`, essentially limiting what kinds of
expressions may occur in the function position of an application. The
following are allowed:

let val f = fn x => x in f end 1
(fn x => x) 1
f 1

but this is not allowed, or rather should not parse as applications:

if true then f else g 1
^^^^^^^^^^^^^^^^^^^^^
this is not an `atexp`
added simple pratt parser for infix expressions
move showBinop to top of file

fixes the build