Observe attribute changes in big complex object trees, like a generic & standalone ActiveModel::Dirty