Tidy up post-expression parsing

The post expression parsing was large and dealt with a number of cases
at once. The dot request parsing, operator parsing and assignment have
all been split off into their own parse functions. Operator parsing no
longer parses everything to the right and then rewrites based on
precedence, but parses each part at a time and builds the AST in the
right order the first time. The assignment symbol is no longer
considered an operator, and has a special parse case when parsing part
of a request.