Depends on D20446. Ref T13279. Currently, the raw ETL fact data is just changes to counts, e.g. a "+1" when a task is created or a "-1" when a task is closed.

We accumulate these changes into a line as part of the "fact()" function, but we can do this more cleanly by making accumluation a separate function.

The raw, unaccumulated functions become "impulse" functions, i.e. each point is like an acceleration "impulse" which we can accumulate to plot speed, since "accumulate" is really "crappy, low-budget integrate() that only works in super easy cases".

The "accumulate()" function can only operate on discrete "impulse" functions because I'm not expecting us to be able to chart "accumulate(mul(x, 2))" and have it figure out that that ∫(2x)dx = x^2 and chart that. We can actually run "accumulate()" on sampled real functions and get a numerical approximation, but this is silly and far afield from the useful set of problems we're trying to solve, so just prevent it.

The name "impulse" may change since I'm still not totally sure how functions will end up organized, I'm just trying to move toward a reasonable definition of "add(x, y)" that works when X and Y are functions like "open tasks in project X" and "open tasks in project Y" and being able to get a sensible line out of it.