Idempotent binding parser

Related to the discussion in #839 

This PR adds a `bindings` object for all nodes with bindings, which allows the parser to skip bindings that already exist. The downside, of course, is more memory usage (approximately 1-2% more on average). It does provide a convenient way to get at the bindings of a particular node though, which is valuable for debugging.

The current implementation would require switching the places where we manually create binding definitions outside of the binding parser.

@nickjs @SoapyIllusions