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.
yeah, my first draft had a similar note to that but it felt a little too editorialized. i think i could re-work it a bit to be more informative than preachy.