(Some more thinking-out-loud stuff.) The purpose of constructing the object tree (second stage) is to reform the AST into something more convenient for the execution (third stage).
To that end, function nodes and their opts/args/code child nodes should be "collapsed" into one node somehow.
I can also handle the choosing of functions in the second stage, so that it's not done in the first stage (at parse time).
Ah-ha, best way to describe the second stage: converting AST nodes into object nodes, like AST_number to pInteger or pFloat, plus building the symbol table. I think that gets basically all of its purpose. Excellent, that helps me a lot.
Just had a realization as to (part of) why it's so useful to convert from AST to object tree: object nodes can have more methods defined, like a successor function, and there's a good distinction here between what it looks like and what it is/does.