!str #15236 new transformer

This is far from finished, but I need to discuss.

The end goal of this is to provide a powerful, efficient, low level API for custom transformation operations. It is supposed to replace `Transformer`.

So far this is only using the API of the `impl.fusing.Op` (and subsclasses). These will be made more user friendly where needed. We can also consider providing higher level API that is more convenient for certain type of operations.

As first step I'm replacing all existing `Transformer` usage.

I'm currently stuck in `HttpEntity` and we must discuss how to go forward there. @jrudolph @sirthias should be part of that discussion.
what about something like this:

  sealed trait NewTransformer[-T, +U] extends DeterministicOp[T, U]
  
  abstract class IteratorTransformer[-T, +U] extends NewTransformer[T, U] {
    def onNext(element: T): Iterator[U]
    def isComplete: Boolean = false
    def onComplete(): Iterator[U] = Iterator.empty
    def onError(cause: Throwable): Throwable = cause
  
    // FIXME implement the methods DeterministicOp here
  }
  
  abstract class SingleElementTransformer[-T, +U] extends NewTransformer[T, U] {
    /** return null means that no element emitted downstream */
    def onNext(element: T): U
    def isComplete: Boolean = false
    /** return null means that no element emitted downstream */
    def onComplete(): U = null.asInstanceOf[U]
    def onError(cause: Throwable): Throwable = cause
  
    // FIXME implement the methods DeterministicOp here
  }

The transformer of the `transformDataBytes` would then be `NewTransformer[ByteString, ByteString]`.

At places where akka-http-core invokes `onNext` `onComplete` directly for performance reasons it can still do that, but must consider the two possible implementations.

Is it overkill with `SingleElementTransformer`? I think it will save tons of allocations.