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.
if (__DEV__) {
    workInProgress._debugHookTypes = hookTypesDev;
  }
   This check uses currentHook so that it works the same in DEV and prod bundles.
   hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.
  const didRenderTooFewHooks =
    currentHook !== null && currentHook.next !== null;
  renderExpirationTime = NoWork;
  currentlyRenderingFiber = (null: any);
  currentHook = null;
  workInProgressHook = null;
  if (__DEV__) {
    currentHookNameInDev = null;
    hookTypesDev = null;
    hookTypesUpdateIndexDev = -1;
  }
  didScheduleRenderPhaseUpdate = false;
  invariant(
    !didRenderTooFewHooks,
    'Rendered fewer hooks than expected. This may be caused by an accidental ' +
      'early return statement.',
  );
  return children;
}
export function bailoutHooks(
  current: Fiber,
  workInProgress: Fiber,
  expirationTime: ExpirationTime,
) {
  workInProgress.updateQueue = current.updateQueue;