// every coroutine can call CoExpressions, CoGenerators and CoConsumers:
  public static <InT, OutT> OutT coCall(CoExpression<InT, OutT> target, InT value);
  public static <OutT> OutT coCall(CoGenerator<OutT> target);
  public static <InT> void coCall(CoConsumer<InT> target, InT value);
  
  // only Coroutines can call coYield:
  public static void coYield();
  
  // a CoConsumer can return:
  public final InT coReturn();
  
  // CoExpressions and CoGenerators can return a value:
  public final InT coReturn(OutT retValue);