Fix a bug with multiple interleaved events in SimulatedEventLoop

The new test used to segfault, and now it works correctly.

Change-Id: I2dd35ee637f42d8ff926c508fa3872227fe6cdab
diff --git a/aos/events/event_loop.cc b/aos/events/event_loop.cc
index da89d9b..e69fd0d 100644
--- a/aos/events/event_loop.cc
+++ b/aos/events/event_loop.cc
@@ -442,12 +442,20 @@
 
 namespace {
 bool CompareEvents(const EventLoopEvent *first, const EventLoopEvent *second) {
-  return first->event_time() > second->event_time();
+  if (first->event_time() > second->event_time()) {
+    return true;
+  }
+  if (first->event_time() < second->event_time()) {
+    return false;
+  }
+  return first->generation() > second->generation();
 }
 }  // namespace
 
 void EventLoop::AddEvent(EventLoopEvent *event) {
   DCHECK(std::find(events_.begin(), events_.end(), event) == events_.end());
+  DCHECK(event->generation() == 0);
+  event->set_generation(++event_generation_);
   events_.push_back(event);
   std::push_heap(events_.begin(), events_.end(), CompareEvents);
 }
@@ -455,6 +463,7 @@
 void EventLoop::RemoveEvent(EventLoopEvent *event) {
   auto e = std::find(events_.begin(), events_.end(), event);
   if (e != events_.end()) {
+    DCHECK(event->generation() != 0);
     events_.erase(e);
     std::make_heap(events_.begin(), events_.end(), CompareEvents);
     event->Invalidate();