Decouple filter selection from channel construction

Allow plugins to extend the set of filters used by gRPC core:
- plugins at construction time can register against the 'channel_init' system to be allowed to mutate a new channel_stack_builder type
- channel_stack_builder provides a central and rather dynamic place to construct the list of filters required by a channel stack
- ultimately we construct the channel stack in the fashion we always have

This is also a prerequisite step to allowing filters to be implemented from wrapped languages.
diff --git a/BUILD b/BUILD
index b4db5d5..dfac32e 100644
--- a/BUILD
+++ b/BUILD
@@ -169,8 +169,10 @@
     "src/core/tsi/transport_security.h",
     "src/core/tsi/transport_security_interface.h",
     "src/core/census/grpc_filter.h",
+    "src/core/census/grpc_plugin.h",
     "src/core/channel/channel_args.h",
     "src/core/channel/channel_stack.h",
+    "src/core/channel/channel_stack_builder.h",
     "src/core/channel/client_channel.h",
     "src/core/channel/client_uchannel.h",
     "src/core/channel/compress_filter.h",
@@ -249,9 +251,12 @@
     "src/core/surface/call.h",
     "src/core/surface/call_test_only.h",
     "src/core/surface/channel.h",
+    "src/core/surface/channel_init.h",
+    "src/core/surface/channel_stack_type.h",
     "src/core/surface/completion_queue.h",
     "src/core/surface/event_string.h",
     "src/core/surface/init.h",
+    "src/core/surface/lame_client.h",
     "src/core/surface/server.h",
     "src/core/surface/surface_trace.h",
     "src/core/transport/byte_stream.h",
@@ -308,8 +313,10 @@
     "src/core/tsi/transport_security.c",
     "src/core/census/grpc_context.c",
     "src/core/census/grpc_filter.c",
+    "src/core/census/grpc_plugin.c",
     "src/core/channel/channel_args.c",
     "src/core/channel/channel_stack.c",
+    "src/core/channel/channel_stack_builder.c",
     "src/core/channel/client_channel.c",
     "src/core/channel/client_uchannel.c",
     "src/core/channel/compress_filter.c",
@@ -395,7 +402,9 @@
     "src/core/surface/channel.c",
     "src/core/surface/channel_connectivity.c",
     "src/core/surface/channel_create.c",
+    "src/core/surface/channel_init.c",
     "src/core/surface/channel_ping.c",
+    "src/core/surface/channel_stack_type.c",
     "src/core/surface/completion_queue.c",
     "src/core/surface/event_string.c",
     "src/core/surface/init.c",
@@ -403,7 +412,6 @@
     "src/core/surface/metadata_array.c",
     "src/core/surface/server.c",
     "src/core/surface/server_chttp2.c",
-    "src/core/surface/server_create.c",
     "src/core/surface/validate_metadata.c",
     "src/core/surface/version.c",
     "src/core/transport/byte_stream.c",
@@ -475,8 +483,10 @@
   name = "grpc_unsecure",
   srcs = [
     "src/core/census/grpc_filter.h",
+    "src/core/census/grpc_plugin.h",
     "src/core/channel/channel_args.h",
     "src/core/channel/channel_stack.h",
+    "src/core/channel/channel_stack_builder.h",
     "src/core/channel/client_channel.h",
     "src/core/channel/client_uchannel.h",
     "src/core/channel/compress_filter.h",
@@ -555,9 +565,12 @@
     "src/core/surface/call.h",
     "src/core/surface/call_test_only.h",
     "src/core/surface/channel.h",
+    "src/core/surface/channel_init.h",
+    "src/core/surface/channel_stack_type.h",
     "src/core/surface/completion_queue.h",
     "src/core/surface/event_string.h",
     "src/core/surface/init.h",
+    "src/core/surface/lame_client.h",
     "src/core/surface/server.h",
     "src/core/surface/surface_trace.h",
     "src/core/transport/byte_stream.h",
@@ -594,8 +607,10 @@
     "src/core/surface/init_unsecure.c",
     "src/core/census/grpc_context.c",
     "src/core/census/grpc_filter.c",
+    "src/core/census/grpc_plugin.c",
     "src/core/channel/channel_args.c",
     "src/core/channel/channel_stack.c",
+    "src/core/channel/channel_stack_builder.c",
     "src/core/channel/client_channel.c",
     "src/core/channel/client_uchannel.c",
     "src/core/channel/compress_filter.c",
@@ -681,7 +696,9 @@
     "src/core/surface/channel.c",
     "src/core/surface/channel_connectivity.c",
     "src/core/surface/channel_create.c",
+    "src/core/surface/channel_init.c",
     "src/core/surface/channel_ping.c",
+    "src/core/surface/channel_stack_type.c",
     "src/core/surface/completion_queue.c",
     "src/core/surface/event_string.c",
     "src/core/surface/init.c",
@@ -689,7 +706,6 @@
     "src/core/surface/metadata_array.c",
     "src/core/surface/server.c",
     "src/core/surface/server_chttp2.c",
-    "src/core/surface/server_create.c",
     "src/core/surface/validate_metadata.c",
     "src/core/surface/version.c",
     "src/core/transport/byte_stream.c",
@@ -1272,8 +1288,10 @@
     "src/core/tsi/transport_security.c",
     "src/core/census/grpc_context.c",
     "src/core/census/grpc_filter.c",
+    "src/core/census/grpc_plugin.c",
     "src/core/channel/channel_args.c",
     "src/core/channel/channel_stack.c",
+    "src/core/channel/channel_stack_builder.c",
     "src/core/channel/client_channel.c",
     "src/core/channel/client_uchannel.c",
     "src/core/channel/compress_filter.c",
@@ -1359,7 +1377,9 @@
     "src/core/surface/channel.c",
     "src/core/surface/channel_connectivity.c",
     "src/core/surface/channel_create.c",
+    "src/core/surface/channel_init.c",
     "src/core/surface/channel_ping.c",
+    "src/core/surface/channel_stack_type.c",
     "src/core/surface/completion_queue.c",
     "src/core/surface/event_string.c",
     "src/core/surface/init.c",
@@ -1367,7 +1387,6 @@
     "src/core/surface/metadata_array.c",
     "src/core/surface/server.c",
     "src/core/surface/server_chttp2.c",
-    "src/core/surface/server_create.c",
     "src/core/surface/validate_metadata.c",
     "src/core/surface/version.c",
     "src/core/transport/byte_stream.c",
@@ -1434,8 +1453,10 @@
     "src/core/tsi/transport_security.h",
     "src/core/tsi/transport_security_interface.h",
     "src/core/census/grpc_filter.h",
+    "src/core/census/grpc_plugin.h",
     "src/core/channel/channel_args.h",
     "src/core/channel/channel_stack.h",
+    "src/core/channel/channel_stack_builder.h",
     "src/core/channel/client_channel.h",
     "src/core/channel/client_uchannel.h",
     "src/core/channel/compress_filter.h",
@@ -1514,9 +1535,12 @@
     "src/core/surface/call.h",
     "src/core/surface/call_test_only.h",
     "src/core/surface/channel.h",
+    "src/core/surface/channel_init.h",
+    "src/core/surface/channel_stack_type.h",
     "src/core/surface/completion_queue.h",
     "src/core/surface/event_string.h",
     "src/core/surface/init.h",
+    "src/core/surface/lame_client.h",
     "src/core/surface/server.h",
     "src/core/surface/surface_trace.h",
     "src/core/transport/byte_stream.h",