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.
it('does not schedule an update for subscriptions that fire with an unchanged snapshot', () => {
    const MockComponent = jest.fn(Component);
    const source = createSource('one');
    const mutableSource = createMutableSource(source);
    act(() => {
      ReactNoop.render(
        <MockComponent
          label="only"
          getSnapshot={defaultGetSnapshot}
          mutableSource={mutableSource}
          subscribe={defaultSubscribe}
        />,
        () => Scheduler.unstable_yieldValue('Sync effect'),
      );
      expect(Scheduler).toFlushAndYieldThrough(['only:one', 'Sync effect']);
      ReactNoop.flushPassiveEffects();
      expect(source.listenerCount).toBe(1);
      
      source.value = 'one';
      expect(Scheduler).toFlushWithoutYielding();
    });
  });
  
  it('should throw and restart if getSnapshot changes between scheduled update and re-render', () => {
    const source = createSource('one');
    const mutableSource = createMutableSource(source);
    const newGetSnapshot = s => 'new:' + defaultGetSnapshot(s);
    let updateGetSnapshot;
    function WrapperWithState() {