uses Object.observe to keep object tree updated. fixed a few bugs.