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.
nit: i think this might need a rewording-- ".listenOn retains last emitted values" perhaps?

It'd be also nice if the names of the attributes were more different, but that's an even nittier nit.