!str #16069 disallows using one Keyed sink/source ambiguously (many times)

This can / should wait for Patrik's move-all-the-things PR.
Refs #16069 
great proposal @patriknw, I'll use that idea. Yes, it's supposed to be only for keyed elements - my mistake when fixing up this commit for discussions.

Now what's left is that problem case:

```
val inSource = Source.subscriber[Int]

        val source = Source[String]() { implicit b ⇒
          import FlowGraphImplicits._
          val out = UndefinedSink[String]
          inSource ~> Flow[Int].map(_.toString) ~> out
          out
        }


val mm = FlowGraph { implicit b ⇒
          import FlowGraphImplicits._
          source ~> Flow[String].map(_.toInt) ~> flow ~> Flow[Int].map(_.toString) ~> sink
```

which blows up currently (investigating that right now).