Add timing reports for both simulation and shm

This involves a major refactor of how event loops are put together.
Lots of functionality for timing reports is in the base event loop
class (though hidden as much as possible to avoid cluttering the
interface).  More functionality is now in the base class, with simpler
and more consistent subclasses.

Change-Id: I163ffb8d1b0e29a0231b54e205c2d7c5241d662b
diff --git a/aos/events/logger.cc b/aos/events/logger.cc
index 6b659c0..d39f0a7 100644
--- a/aos/events/logger.cc
+++ b/aos/events/logger.cc
@@ -378,6 +378,9 @@
 void LogReader::Register(EventLoop *event_loop) {
   event_loop_ = event_loop;
 
+  // Otherwise we replay the timing report and try to resend it...
+  event_loop_->SkipTimingReport();
+
   for (size_t i = 0; i < channels_.size(); ++i) {
     CHECK_EQ(configuration()->channels()->Get(i)->name(),
              event_loop_->configuration()->channels()->Get(i)->name());
@@ -392,7 +395,7 @@
     std::pair<monotonic_clock::time_point, int> oldest_channel_index =
         PopOldestChannel();
     const monotonic_clock::time_point monotonic_now =
-        event_loop_->monotonic_now();
+        event_loop_->context().monotonic_sent_time;
     CHECK(monotonic_now == oldest_channel_index.first)
         << ": Now " << monotonic_now.time_since_epoch().count()
         << " trying to send "