util/PeriodicScheduler: first draft.

Some caveats:

  * Because of the way Boost.Asio works, there needs to be at least one
    thread calling the io_service's `run` method, which parcels out work
    (like calling timer-expiry handlers) to calling threads as long as
    there's work left to do or asynchronous calls that haven't finished.

    Normally we'd have a ProtocolNode with some number of threads already
    in the `run` routine, but in our test program we need to call that
    method ourselves.

  * A new thread is created each time any slot's timer expires.  I don't
    currently know much about the (performance) cost of launching new
    threads, but I'd have to guess that it's non-trivial.

    We should probably replace this thread-per-expiry mechanism with some
    sort of thread pool implementation.  (I bet the Boost.Asio docs have
    something useful).
CMakeLists.txt: use partial matches (regexps) to check for diff. compilers