Hold a wake lock while polling
This branch adds a "wakeful IO executor" that can be used to run IO tasks while holding a wake lock. Plugins use the executor for asynchronous polling tasks so that we can continue to poll contacts in parallel as we did before.
Most of this MR is constructor churn. The next MR will use injection to reduce the constructor churn caused by future changes.
Fourth part of #1142 (closed)