Adds a shallow shim of the Graph DSL

* has two different graph builders
* adds tests of what compiles and what not
* writes HttpPipeline with both graph builders

Fixes #15767
I think parameters of `to` should be inverted: `to(f3, out1)`
or perhaps use two overloaded `attach`:

      val g = VertexBuilder()
        .merge(f1, f5, f2)
        .broadcast(f2, f3 :: f4 :: Nil)
        .broadcast(f4, f5 :: f6 :: Nil)
        .attach(in, f1)
        .attach(f3, out1)
        .attach(f6, out2)