Synchronizing all events to better handle epoch change

Following are the events to be synchronized:
- [x] epoch change
- [x] meta (from parent or child) change
- [x] data request to send
- [x] data request received
- [x] data response to send
- [x] data response received

As a next step on this work, it needs:
1. send http response back for epoch discrepancy.

Once that's finished, we can do random failure test on Task#ChildDataReady.
+1 for moving init stuff out of the run func.