GM_addValueChangeListener(key, fn) {
    if (!isString(key)) key = `${key}`;
    if (!isFunction(fn)) return;
    const hooks = ensureNestedProp(changeHooks, this.id, key);
    const i = objectValues(hooks)::indexOf(fn);
    let listenerId = i >= 0 && objectKeys(hooks)[i];
    if (!listenerId) {
      listenerId = safeGetUniqId('VMvc');
      hooks[listenerId] = fn;
    }
    return listenerId;
  }
@this {GMContext}
@param {String} key - name of the value to monitor
@param {GMValueChangeListener} fn - callback
@returns {String} listenerId