if (dependencyStack.includes(key)) {
      const message = `Recoil selector has circular dependencies: ${dependencyStack
        .slice(dependencyStack.indexOf(key))
        .join(' \u2192 ')}`;
      return loadableWithError<T>(err(message));
    }
FIXME: dep keys should take into account the state of the loadable to
prevent the edge case where a loadable with an error and a loadable with
an error as a value are treated as the same thing incorrectly. For example
these two should be treated differently:

selector({key: '', get: () => new Error('hi')});
selector({key: '', get () => {throw new Error('hi')}});

With current implementation they are treated the same