* Refactor to move Task Queue to its own class
- This is to help with sharing task queue among
multiple message loops going forward.
- currently there is 1:1 mapping between task queue
and message loop, we are still maintaining the semantics
for this change.
* Add mutex include
* Most of the waking up changes minus test failures
* Refactor MessageLoopImpl to be Wakeable
- Makes testing easier by letting us putting a TestWakeable
- Also move the waking up logic to the task queue
* add tests
* Fix formatting and license