!htc #15726: Akka HTTP with the new DSL

/cc @jrudolph @sirthias 

TODO:
 - [X] Port http-core
 - [x] Port rest of http
 - [ ] Port to the new IO abstraction
 - [x] get rid of unnecessary materializer parameters
One remaining issue here is that the graph part of this flow is only a very small part but now all code needs to live inside the graph. Here's how I'd imagine this code to look like:

```scala
val network: Flow[ByteString, ByteString] = ...

val rendering: Flow[HttpRequest, ByteString] =
  Flow[HttpRequest]()
    .transform("renderer", () ⇒ requestRendererFactory.newRenderer)
    .flatten(FlattenStrategy.concat)
    .transform("errorLogger", () ⇒ errorLogger(log, "Outgoing request stream error"))

val parsing: Flow[ByteString, HttpResponse] =
  Flow[ByteString]
    .transform("rootParser", () ⇒ rootParser.copyWith(warnOnIllegalHeader, requestMethodByPass))
    .splitWhen(_.isInstanceOf[MessageStart])
    .headAndTail
    .collect {
      case (ResponseStart(statusCode, protocol, headers, createEntity, _), entityParts) ⇒
        HttpResponse(statusCode, headers, createEntity(entityParts), protocol)
    }

val pipeline: Flow[HttpRequest, HttpResponse] =
  rendering.connect(network).connect(parsing)

// in the best case, this would be provided by akka-stream (#15957) and then we could even drop it from the HTTP client API
def withContext[T, U, C](flow: Flow[T, U]): Flow[(T, C), (U, C)] = // do graph stuff only in here

val pipelineWithContext: Flow[(HttpRequest, Any), (HttpResponse, Any)] = withContext(pipeline)

val (userOut: Sink[(HttpRequest, Any)], userIn: Source[(HttpResponse, Any)]) = pipelineWithContext.run()
Http.OutgoingConnection(
  tcpConn.remoteAddress,
  tcpConn.localAddress,
  userOut,
  userIn) // shouldn't we even keep the flow here?
```

We don't need to do this now but that's where it should be going.