Model iteration parser refactor

Best reviewed commit by commit, although files other than parser.js have minimal changes and can be reviewed on the PR. This is a refactor of the parsing logic that makes no functional changes (well, there are a few very minor differences, but they are very far out edge cases that shouldn't matter—I'll annotate them).

The idea is to clean up the parsing logic to make it easier to write plugins that contain custom mug types. As a proof of concept, all itemset parsing logic has been moved out of the core parser.js module into the itemset plugin.

Additionally, it is now possible for a mug type to intercept and manipulate retrieval of child nodes, both in the data and control trees. This means the existing `Repeat` mug type is no longer a special case with hard-coded logic in the control tree parser. Data tree child interception/manipulation is not used yet, but will be needed for model iteration.
Select mugs are now converted to their dynamic counterpart just in time when an `<itemset>` is encountered during control parsing. Previously every select node preemptively scanned through its children to find out if it had an `<itemset>` or not.