Refactored protobuf framework, added loader

Included changes:

* Initial adapter interface spec
* Adapter loader to auto-load adapters
* Initial adapter NBI
* Better import support in chameleon, allowing more flexible
  protobuf structure (by organizing artifacts and service
  into separate proto files.
* Refactored voltha.proto to split things into logical proto
  modules.
* Some additional cleanup

Change-Id: I75f9883c6992148ea8df430bcdaebf85115fea4a
diff --git a/voltha/main.py b/voltha/main.py
index c4ed67b..f28cdbe 100755
--- a/voltha/main.py
+++ b/voltha/main.py
@@ -28,6 +28,7 @@
 from common.utils.dockerhelpers import get_my_containers_name
 from common.utils.nethelpers import get_my_primary_interface, \
     get_my_primary_local_ipv4
+from voltha.adapters.loader import AdapterLoader
 from voltha.coordinator import Coordinator
 from voltha.northbound.grpc.grpc_server import VolthaGrpcServer
 from voltha.northbound.kafka.kafka_proxy import KafkaProxy, get_kafka_proxy
@@ -217,6 +218,7 @@
         self.coordinator = None
         self.grpc_server = None
         self.kafka_proxy = None
+        self.adapter_loader = None
 
         if not args.no_banner:
             print_banner(self.log)
@@ -230,9 +232,10 @@
     def start(self):
         self.start_reactor()  # will not return except Keyboard interrupt
 
+    @inlineCallbacks
     def startup_components(self):
         self.log.info('starting-internal-components')
-        self.coordinator = Coordinator(
+        self.coordinator = yield Coordinator(
             internal_host_address=self.args.internal_host_address,
             external_host_address=self.args.external_host_address,
             rest_port=self.args.rest_port,
@@ -241,10 +244,14 @@
             consul=self.args.consul).start()
         init_rest_service(self.args.rest_port)
 
-        self.grpc_server = VolthaGrpcServer(self.args.grpc_port).start()
+        self.grpc_server = yield VolthaGrpcServer(self.args.grpc_port).start()
 
         # initialize kafka proxy singleton
-        self.kafka_proxy = KafkaProxy(self.args.consul, self.args.kafka)
+        self.kafka_proxy = yield KafkaProxy(self.args.consul, self.args.kafka)
+
+        # adapter loader
+        self.adapter_loader = yield AdapterLoader(
+            config=self.config.get('adapter_loader', {})).start()
 
         self.log.info('started-internal-services')
 
@@ -252,6 +259,8 @@
     def shutdown_components(self):
         """Execute before the reactor is shut down"""
         self.log.info('exiting-on-keyboard-interrupt')
+        if self.adapter_loader is not None:
+            yield self.adapter_loader.stop()
         if self.coordinator is not None:
             yield self.coordinator.stop()
         if self.grpc_server is not None: