code: public static <T, X extends Throwable> void forEach(final Stream<T> stream, final Consumer<? super T> consumerElement,
                                                          final Consumer<? super Throwable> consumerError, final Runnable onComplete) {
  
          val t2 = FutureStreamUtils.forEachEvent(stream, consumerElement, consumerError, onComplete);
          t2._2().run();
  
      }
docs: Perform a forEach operation over the Stream  capturing any elements and errors in the supplied consumers
  when the entire Stream has been processed an onComplete event will be recieved.
  
  <pre>
  @{code
  Subscription next = Streams.forEach(Stream.of(()->1,()->2,()->{throw new RuntimeException()},()->4)
  .map(Supplier::getValue),System.out::println, e->e.printStackTrace(),()->System.out.println("the take!"));
  
  System.out.println("processed!");
  
  
  //prints
  1
  2
  RuntimeException Stack Trace on System.err
  4
  processed!
  
  
  }
  </pre>
  @param stream - the Stream to consume data from
  @param consumerElement To accept incoming elements from the Stream
  @param consumerError To accept incoming processing errors from the Stream
  @param onComplete To run after an onComplete event
  @return Subscription so that further processing can be continued or cancelled.