Don't report changes that have already been reported.

If A is a dependent change of B, and A and B finish test around
the same time, the following may happen:

Complete event for A is received.
A is marked as complete.
Complete event for B is received.
B is marked as complete.
Begin processing complete event for A
A is reported.
Since A merged, and B is dependent on A, zuul checks to see if
  B should be reported (it may have been waiting on A).
B is complete, so it is reported.
End of processing A's complete event
Begin processing B's complete event
B is reported (but fails to report correctly).

To avoid this, record that a change has been succesfully reported,
(regardless of the outcome of tests), and if requested to report
the change again, simply return True, indicating that it has been
succesfully reported.

Change-Id: I5edbf158e7ef749cf855cadbacdc44161c054c59
diff --git a/zuul/model.py b/zuul/model.py
index a0fc05a..c4efa39 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -301,6 +301,7 @@
         self.oldrev = None
         self.newrev = None
         self.event = event
+        self.reported = False
 
         if event.change_number:
             self.branch = event.branch
diff --git a/zuul/scheduler.py b/zuul/scheduler.py
index 15e246d..f0262c8 100644
--- a/zuul/scheduler.py
+++ b/zuul/scheduler.py
@@ -482,6 +482,8 @@
 
     def reportChange(self, change):
         self.log.debug("Reporting change %s" % change)
+        if change.reported:
+            return True
         ret = None
         if change.didAllJobsSucceed():
             action = self.success_action
@@ -497,6 +499,8 @@
             if ret:
                 self.log.error("Reporting change %s received: %s" % (
                         change, ret))
+            else:
+                change.reported = True
         except:
             self.log.exception("Exception while reporting:")
             change.setReportedResult('ERROR')