code: function diff(older, newer) {
      if (!older) return newer
      if (!newer) return null
      return keys(newer).reduce(function(changes, key) {
          var newValue = newer[key]
          var oldValue = older[key]
  
          // if they are the same, then skip
          if (isEqual(oldValue, newValue))
              return changes
  
          // if both new values and old values are plain objects we should diff them
          if (isPlainObject(newValue) && isPlainObject(oldValue)) {
              changes[key] = diff(oldValue, newValue)
          }
          else {
              // Arrays, nulls, values, just replace
              changes[key] = newValue
          }
  
          return changes
      }, {})
  }
docs: /*
  
  returns the update object of differences between the two objects
  deeply nested, but can't do updates to sub-arrays (just replaces them)
  
  var v = diff(null, {name: "sean"})    // returns the whole object
  diff(v, {name: "sean", age: 32)       // {age:32}
  diff(v, {name: "bobby"})              // {name:"bobby"}