MarshallingDirectives, FormFieldDirectives, and more

It may not readily show but this PR has been keeping me busy for far too long.
Due to numerous interdependencies it addresses 3 tickets at the same time: #15927, #15923 and #16190.

I'm glad to finally get this beast of my table! :)
I agree. IMHO `UnsupportedContentTypeException` and therefore `firstOf` are only relevant for `FromEntityUnmarshaller`s. I played a bit around but wasn't able to stuff `supported´ content types into `EnhancedFromEntityUnmarshaller`as it is an implicit class which doesn't accept additional parameters:

```scala
def firstOf[A](unmarshallers: FromEntityUnmarshaller[A]*)(implicit ec: ExecutionContext): FromEntityUnmarshaller[A] =
  new Unmarshaller[HttpEntity, A] {
    def apply(e: HttpEntity) = unmarshallers
      .find(um ⇒ matches(e.contentType, um.supported))
      .orElse(unmarshallers.find(_.supported.isEmpty)) match {
        case Some(um) ⇒ um(e)
        case _        ⇒ FastFuture.failed(UnsupportedContentTypeException(unmarshallers.flatMap(_.supported.distinct)))
      }
  }

private def matches(contentType: ContentType, supportedRanges: immutable.Seq[ContentTypeRange]) =
  contentType == ContentTypes.NoContentType || supportedRanges.exists(_ matches contentType)

implicit class EnhancedFromEntityUnmarshaller[A](val underlying: FromEntityUnmarshaller[A], _supported: immutable.Seq[ContentTypeRange] = Seq.empty) extends AnyVal {
  def mapWithCharset[B](f: (A, HttpCharset) ⇒ B)(implicit ec: ExecutionContext): FromEntityUnmarshaller[B] =
    underlying.mapWithInput { (entity, data) ⇒ f(data, entity.contentType.charset) }

  def supported = _supported // doesn't work

  def apply(f: HttpEntity ⇒ Future[A]) = (entity: HttpEntity) ⇒ {
    if (_supported.isEmpty || matches(entity.contentType, _supported)) underlying(entity).fast
    else FastFuture.failed(UnsupportedContentTypeException(_supported: _*))
  }

  def mapContentTypeRanges(f: Seq[ContentTypeRange] ⇒ Seq[ContentTypeRange]): FromEntityUnmarshaller[A] =
    new EnhancedFromEntityUnmarshaller(underlying, f(_supported))

  def forContentTypes(ranges: ContentTypeRange*) =
    mapContentTypeRanges(_ ⇒ ranges)
}
```

But maybe in the case of `NoContentType` we can only try all available unmarshallers.

But let's leave it at that and thanks for explaining!