Instantiate `Job` events lazily to avoid OOM error
Instantiate `Job` events lazily to avoid OOM error

During load testing (which often involves many concurrent jobs) we can
sometimes hit an out memory issue when allocating too many
`multiprocessing.Event`s. Instead of creating the event at `Job`
creation time simply wait until client code requires it for
synchronization (eg. by making a call to a blocking method).
It should generally be the case that load tests won't
require a large proportion of jobs to be synced with client code anyway.

Additionally,
- add `Session.uptime` the elapsed time since the first event for the session
- assign the session's create event time in its initializer

sangoma/switchy