Ref: https://github.com/reactjs/rfcs/pull/147#issuecomment-623740218

React version: 0.0.0-experimental-e5d06e34b

## Steps To Reproduce

1. createMutableSource that contains functions
2. getSnapshot returns one of the functions

Link to code example:

https://codesandbox.io/s/jovial-dew-1eg4t?file=/src/App.js

## The current behavior

If getSnapshot returns a function, it will run the function in render. This results in various errors.

My workaround: return an object wrapping a function, and destruct on caller.

> For now, you can work around this by returning a function that returns your function

I don't know how this works as workaround.

## The expected behavior

It would be nice if returning a function just works.

Note: this is not a rare use case in my library https://github.com/dai-shi/use-context-selector
because we often pass `[state, setState]` in a context value.
/>,
      );
      
      
      expect(Scheduler).toFlushUntilNextPaint([]);
      
      
      
      ReactNoop.discreteUpdates(() => {
        mutateA('a1');
      });
      expect(Scheduler).toFlushUntilNextPaint([]);
      expect(root.getChildrenAsJSX()).toEqual('first: a1, second: a1');
    });
    expect(root.getChildrenAsJSX()).toEqual('first: a1, second: a1');
  });
  
  it(
    'if source is mutated after initial read but before subscription is set ' +
      'up, should still entangle all pending mutations even if snapshot of ' +
      'new subscription happens to match',
    async () => {
      const source = createSource({
        a: 'a0',
        b: 'b0',
      });
      const mutableSource = createMutableSource(source);
      const getSnapshotA = () => source.value.a;
      const getSnapshotB = () => source.value.b;
      function mutateA(newA) {