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
Now that I look at it it doesn't read as well as I had imagined... 
Also had the below idea in mind at some point:

```scala
def bind(output: OutputFactory[T], to: Flow[_, T]): ...
def bind(input: InputFactory[T], to: Flow[T, _]): ...

// reads:
.bind(videoOutput, to = someFlow)
```