changeset optimizations

A massive refactor of the changesets lib. I can't say every change worth it, but main idea was:
- remove obsolete optimization tricks, like Array.join(). Performance gain in synthetic tests for follow function was 2x
- review and rewrite frequently created objects into prototyped classes (all assemblers affected) -> save memory, allow v8 optimizations by limiting number of hidden classes.
- remove redundant and duplicated code, use existing abstractions (optimize and reuse eachAttribNumber)
- given up on inverse() function :) maybe later

Effects can be seen in synthetic tests under heavy load -> less memory, faster ops throughput. At least pulling rewrites of basic assemblers and attribute iterators are highly recommended :)

Passes all easysync tests, works with new timeslider branch (test covers invert operations)