Create a Boundary abstraction to which users can bind arbitrary Consumers. Calling the `bind(Consumer)` method returns a new Consumer that manages the internal state of calling the internal CountDownLatch after calling the delegate Consumer. This means you can bind an entire flow of Consumers to a Boundary and then block the calling thread until all bound Consumers have been called.

The `await(long, TimeUnit)` method will divide up the timeout among all the bound Consumers. e.g. if the total timeout specified is 5 seconds and the first Consumer takes 3 seconds to complete and the second one takes 2, the third Consumer will not have any time left in which to await, so the await method will timeout and return false.

No Consumers are cancelled by a Boundary. It is completely passive. It can be called multiple times, as well. If a Consumer has already been invoked, it will simply be skipped.