Emit on change, deep copy objects

To version: `2.0.0`

* Only emit on change
* Deep copy all objects on input and output
* Add keypath access
* Fix nested `.wait()`

This also, somewhat controversially, switches ObjectState to use a more "functional" style internally. This successfully hides the internal state object from any outside mutation, and does not present any notable performance hits.
not exactly, but i should add a test for that.
im actually not sure of a great way to test *directly* that what is emitted is a copy. perhaps to emit twice and compare them by reference?