Refactor signal handling logic

Split Reporter logic into two functions:

* Reporter.start, which blocks forever unless Sys.Break is raised or the
  process is killed (assuming appropriate signal handlers have been set
  up).
* Reporter.start_async, which takes the same arguments as Reporter.start
  but returns a Reporter.t which can be used to cancel or query the
  state of the reporter.

Reporter.start is used by Process.main_loop to allow reporting stats
without spawning a new thread in the case where reporting doesn't need
to happen in the background (e.g. in a dedicated stats-reporting
daemon).

Signed-off-by: John Else <john.else@citrix.com>