Add flatMapWithConcurrencyLimit, flatMapConcat, rateLimit, holdWhen

Related to #318 I implemented a `flatMapWithConcurrencyLimit` method that's a flatMap variant that limits the number of open spawned streams. It buffers incoming events to keep from losing any input.

Then I applied the new combinator to create `flatMapConcat` that's just a shorthand for the previous with limit==1. The default flatMap implementation can be thought of "flatMapMerge" because it merges the output of spawned streams.

Finally, I implemented `rateLimit` as a one-liner on top of  `flatMapConcat`. This is the combinator that was requested in #317 and once implemented in #82 as "limitThroughPut".

And then I added one more thing `holdWhen` that's the same thing as `bufferWhile` in #300, also based on `flatMapConcat`. I chose this name not to confuse this method with the "buffer" family of methods or the takeWhile/skipWhile methods.

DON'T MERGE YET!

TODO: still naming..