big changes, moved equality check inside object hierarchy, removed Object.defineProperty (bah IE8)