code: public static JoinPoint<NoException> onAllDone(Collection<? extends Task<?,?>> tasks) {
  		JoinPoint<NoException> jp = new JoinPoint<>();
  		jp.addToJoin(tasks.size());
  		Runnable jpr = new Runnable() {
  			@Override
  			public void run() {
  				jp.joined();
  			}
  		};
  		jp.start();
  		for (Task<?,?> t : tasks)
  			t.getOutput().listenInline(jpr);
  		return jp;
  	}
docs: Shortcut method to create a JoinPoint waiting for the given tasks, <b>the JoinPoint is started by this method.</b>
  The JoinPoint is not unblocked until all tasks are done. If any has error or is cancel, the error or cancellation
  reason is not given to the JoinPoint, in contrary of the method fromTasks.