shill: cellular: Disconnect service on suspend.

Also, suppress auto-connect as soon as the SuspendDelay signal is
received. Schedule a timeout to detect failed or interrupted suspend
and re-enable auto-connect.

BUG=chromium-os:30587,chromium-os:33412
TEST=unit tests, tested on device through inspecting logs

Change-Id: If40f8217e4d9b222a698532054287ae9b4fcb4d6
Reviewed-on: https://gerrit.chromium.org/gerrit/34342
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/hook_table.h b/hook_table.h
index 91426a1..d80af1c 100644
--- a/hook_table.h
+++ b/hook_table.h
@@ -67,7 +67,11 @@
   void Run(int timeout_ms,
            const base::Callback<void(const Error &)> &done);
 
+  bool IsEmpty() const { return hook_table_.empty(); }
+
  private:
+  friend class HookTableTest;
+
   // For each action, there is a |start| callback which is stored in this
   // structure.
   struct HookAction {