Far = (farName, remotable = undefined) => {
  const r = remotable === undefined ? /** @type {T} */ ({}) : remotable;
  if (typeof r === 'object' && !(GET_METHOD_NAMES in r)) {
    // This test excludes far functions, since we currently consider them
    // to only have a call-behavior, with no callable methods.
    // Beware: Mutates the input argument! But `Remotable`
    // * requires the object to be mutable
    // * does further mutations,
    // * hardens the mutated object before returning it.
    // so this mutation is not unprecedented. But it is surprising!
    Object.defineProperty(r, GET_METHOD_NAMES, getMethodNamesDescriptor);
  }
  return Remotable(`Alleged: ${farName}`, undefined, r);
}
Mark an object to be exposed for remote interaction
and give it a suggestive interface name for debugging.

All properties of the object have to be methods, not data.

The object must not be hardened before it is marked.
It will be hardened after marking.

For far objects (as opposed to far functions), also adds
`__getMethodNames__` method that returns an array of all the method names,
if there is not yet any method named `__getMethodNames__`.

@example
Far('Employee', { getManager })
@template {{}} T
@param {string} farName This name will be prepended with `Alleged: `
for now to form the `Remotable` `iface` argument.
@param {T} [remotable] The object to be marked as remotable