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.
Might add a note saying that this actually isn't an unfortunate consequence of the performance compromise, such objects "shouldn't" be on the state anyway, for some value of "should."