Add support for Poisson injector. Allows randomized load profiles.

This is a rewrite of #1987. Injection now runs for a fixed duration. As a consequence, the number of users can vary from run-to run, depending on the seed, but is deterministic for a given seed.

Also, some of the maths in the original PR was a little suspect, so I've switched to Lewis and Shedler's algorithm, which should be more accurate.
Actually, I can't. `collect` calls `isDefined` and then `applyOrElse`, which means that `shouldKeep` is called twice. However, `shouldKeep` is not referentially transparent, since it involves a random number.

It took me half an hour to figure out why the heck `collect` was failing with a `MatchError`.