Using asio's asynchronous functionality means having a callback function
that will be called when an asynchronous operation completes. In this program
we define a function called print
to be called when the asynchronous wait finishes.

Next, instead of doing a blocking wait as in tutorial Timer.1, we call the
deadline_timer::async_wait()
function to perform an asynchronous wait. When calling this function we pass
the print callback handler
that was defined above.

t.async_wait(&print);

Finally, we must call the io_service::run()
member function on the io_service object.

The asio library provides a guarantee that callback handlers will only be
called from threads that are currently calling io_service::run().
Therefore unless the io_service::run()
function is called the callback for the asynchronous wait completion will
never be invoked.

The io_service::run()
function will also continue to run while there is still "work"
to do. In this example, the work is the asynchronous wait on the timer, so
the call will not return until the timer has expired and the callback has
completed.