Diff & patch for JavaScript objects