function addChange(key, value, silent) {
  if (!changes) changes = {};
  else delete changes[key]; // Deleting first to place the new value at the end
  changes[key] = value;
  if (!silent) callHooksLater();
}
@param {!string} key - must be "a.b.c" to allow clients easily set inside existing object trees
@param {PlainJSONValue} [value]
@param {boolean} [silent] - in case you callHooks() directly yourself afterwards