code: public BProgramSyncSnapshot start( ExecutorService exSvc ) throws InterruptedException {
          Set<BThreadSyncSnapshot> nextRound = new HashSet<>(threadSnapshots.size());
          BPEngineTask.Listener halter = new ViolationRecorder(bprog, violationRecord);
          nextRound.addAll(exSvc.invokeAll(threadSnapshots.stream()
                                  .map(bt -> new StartBThread(bt, halter))
                                  .collect(toList())
                  ).stream().map(f -> safeGet(f) ).collect(toList())
          );
          executeAllAddedBThreads(nextRound, exSvc, halter);
          List<BEvent> nextExternalEvents = new ArrayList<>(getExternalEvents());
          nextExternalEvents.addAll( bprog.drainEnqueuedExternalEvents() );
          return new BProgramSyncSnapshot(bprog, nextRound, nextExternalEvents, violationRecord.get());
      }
docs: Starts the BProgram - runs all the registered b-threads to their first
  {@code bp.sync}.
  
  @param exSvc the executor service that will advance the threads.
  @return A snapshot of the program at the first {@code bp.sync}.
  @throws java.lang.InterruptedException (since it's a blocking call)