shill: Manager: Map between Technology and Provider

Create a map between Technology::Identifier and the Provider, so
most operations on provders are done either by iterating through
the map or by selecting the provider by its technology.  There
are some exceptions remaining, namely the methods called in
ConfigureServiceForProfile, which will be fixed in an upcoming
CL, and a few methods where the Manager explicitly calls
non-generic methods on the WiFiProvider.

BUG=chromium:265518
TEST=Unit tests

Change-Id: I43f217c6050d68d1f94800d08b06a7dcf1e5bafc
Reviewed-on: https://gerrit.chromium.org/gerrit/63605
Commit-Queue: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/manager_unittest.cc b/manager_unittest.cc
index 951fd6f..984844c 100644
--- a/manager_unittest.cc
+++ b/manager_unittest.cc
@@ -134,6 +134,9 @@
     // ownership.
     manager()->wifi_provider_.reset(wifi_provider_);
 
+    // Update the manager's map from technology to provider.
+    manager()->UpdateProviderMapping();
+
     // Replace the manager's crypto util proxy with our mock.  Passes
     // ownership.
     manager()->crypto_util_proxy_.reset(crypto_util_proxy_);
@@ -3855,6 +3858,7 @@
   // object in the fixture.
   MockWiFiProvider *wifi_provider = new NiceMock<MockWiFiProvider>();
   manager.wifi_provider_.reset(wifi_provider);  // pass ownership
+  manager.UpdateProviderMapping();
   // Give manager a valid place to write the user profile list.
   manager.user_profile_list_path_ = temp_dir.path().Append("user_profile_list");