passableSymbolForName = name => {
  typeof name === 'string' ||
    Fail`${q(name)} must be a string, not ${q(typeof name)}`;
  const match = AtAtPrefixPattern.exec(name);
  if (match) {
    const suffix = match[1];
    if (suffix.startsWith('@@')) {
      return Symbol.for(suffix);
    } else {
      const sym = Symbol[suffix];
      if (typeof sym === 'symbol') {
        return sym;
      }
      Fail`Reserved for well known symbol ${q(suffix)}: ${q(name)}`;
    }
  }
  return Symbol.for(name);
}
If `name` is a string that could have been produced by
`nameForPassableSymbol`, return the symbol argument it was produced to
represent.

   If `name` does not begin with `"@@"`, then just the corresponding
     registered symbol, `Symbol.for(name)`.
   If `name` is `"@@"` followed by a well known symbol's property name on
     `Symbol` such `"@@iterator", return that well known symbol such as
     `Symbol.iterator`
   If `name` begins with `"@@@@"` it encodes the registered symbol whose
     name begins with `"@@"` instead.
   Otherwise, if name begins with `"@@"` it may encode a registered symbol
     from a future version of JavaScript, but it is not one we can decode
     yet, so throw.

@param {string} name
@returns {symbol}