observe(getter, handler) {
    if (arguments.length === 1) {
      handler = getter
      getter = []
    }
    let { observerState, entry } = fns.addObserver(this.observerState, getter, handler)
    this.observerState = observerState
    return () => {
      this.observerState = fns.removeObserverByEntry(this.observerState, entry)
    }
  }
Adds a change observer whenever a certain part of the reactor state changes

1. observe(handlerFn) - 1 argument, called anytime reactor.state changes
2. observe(keyPath, handlerFn) same as above
3. observe(getter, handlerFn) called whenever any getter dependencies change with
   the value of the getter

Adds a change handler whenever certain deps change
If only one argument is passed invoked the handler whenever
the reactor state changes

@param {KeyPath|Getter} getter
@param {function} handler
@return {function} unwatch function