Use a descriptor for BindGroupLayout (#211)

* Use a descriptor for BindGroupLayout
* Fix MatchesLambda
* Add WireTests.StructureOfStructureArrayArgument
* Add BindGroupValidationTests.BindGroupLayoutCache
diff --git a/examples/CppHelloTriangle.cpp b/examples/CppHelloTriangle.cpp
index d51241e..5a650ae 100644
--- a/examples/CppHelloTriangle.cpp
+++ b/examples/CppHelloTriangle.cpp
@@ -110,10 +110,11 @@
         .SetInput(0, 4 * sizeof(float), nxt::InputStepMode::Vertex)
         .GetResult();
 
-    nxt::BindGroupLayout bgl = device.CreateBindGroupLayoutBuilder()
-        .SetBindingsType(nxt::ShaderStageBit::Fragment, nxt::BindingType::Sampler, 0, 1)
-        .SetBindingsType(nxt::ShaderStageBit::Fragment, nxt::BindingType::SampledTexture, 1, 1)
-        .GetResult();
+    auto bgl = utils::MakeBindGroupLayout(
+        device, {
+                    {0, nxt::ShaderStageBit::Fragment, nxt::BindingType::Sampler},
+                    {1, nxt::ShaderStageBit::Fragment, nxt::BindingType::SampledTexture},
+                });
 
     nxt::PipelineLayout pl = utils::MakeBasicPipelineLayout(device, &bgl);