_initializeGestureState(gestureState: GestureState) {
    gestureState.moveX = 0;
    gestureState.moveY = 0;
    gestureState.x0 = 0;
    gestureState.y0 = 0;
    gestureState.dx = 0;
    gestureState.dy = 0;
    gestureState.vx = 0;
    gestureState.vy = 0;
    gestureState.numberActiveTouches = 0;
    // All `gestureState` accounts for timeStamps up until:
    gestureState._accountsForMovesUpTo = 0;
  }
A graphical explanation of the touch data flow:

+----------------------------+             +--------------------------------+
| ResponderTouchHistoryStore |             |TouchHistoryMath                |
+----------------------------+             +----------+---------------------+
|Global store of touchHistory|             |Allocation-less math util       |
|including activeness, start |             |on touch history (centroids     |
|position, prev/cur position.|             |and multitouch movement etc)    |
|                            |             |                                |
+----^-----------------------+             +----^---------------------------+
     |                                          |
     | (records relevant history                |
     |  of touches relevant for                 |
     |  implementing higher level               |
     |  gestures)                               |
     |                                          |
+----+-----------------------+             +----|---------------------------+
| ResponderEventPlugin       |             |    |   Your App/Component      |
+----------------------------+             +----|---------------------------+
|Negotiates which view gets  | Low level   |    |             High level    |
|onResponderMove events.     | events w/   |  +-+-------+     events w/     |
|Also records history into   | touchHistory|  |   Pan   |     multitouch +  |
|ResponderTouchHistoryStore. +---------------->Responder+-----> accumulative|
+----------------------------+ attached to |  |         |     distance and  |
                                each event |  +---------+     velocity.     |
                                           |                                |
                                           |                                |
                                           +--------------------------------+



Gesture that calculates cumulative movement over time in a way that just
"does the right thing" for multiple touches. The "right thing" is very
nuanced. When moving two touches in opposite directions, the cumulative
distance is zero in each dimension. When two touches move in parallel five
pixels in the same direction, the cumulative distance is five, not ten. If
two touches start, one moves five in a direction, then stops and the other
touch moves fives in the same direction, the cumulative distance is ten.

This logic requires a kind of processing of time "clusters" of touch events
so that two touch moves that essentially occur in parallel but move every
other frame respectively, are considered part of the same movement.

Explanation of some of the non-obvious fields:

- moveX/moveY: If no move event has been observed, then `(moveX, moveY)` is
  invalid. If a move event has been observed, `(moveX, moveY)` is the
  centroid of the most recently moved "cluster" of active touches.
  (Currently all move have the same timeStamp, but later we should add some
  threshold for what is considered to be "moving"). If a palm is
  accidentally counted as a touch, but a finger is moving greatly, the palm
  will move slightly, but we only want to count the single moving touch.
- x0/y0: Centroid location (non-cumulative) at the time of becoming
  responder.
- dx/dy: Cumulative touch distance - not the same thing as sum of each touch
  distance. Accounts for touch moves that are clustered together in time,
  moving the same direction. Only valid when currently responder (otherwise,
  it only represents the drag distance below the threshold).
- vx/vy: Velocity.