Covers the TCK with tests of the tests and addresses multiple smaller issues

This PR covers the entire TCK with tests of "how the TCK fails", and multiple wrong mini-implementations of publishers / subscribers. The tests aim to verify that the test failures are actually helpful for implementers.

I have also fixed numerous smaller issues (1 race, 1 wrong method called in tests - would never fail as it promissed, multiple NPE errors avoided, and loads of usability improvements) - see comments in line (I hope github will carry over my comments on that commit to this PR).

This is (IMHO) really important to scrutinize and get in before for RC1 – please review guys!
Resolves #172 as well as multiple "the test is not helpful" or "the test can be racy" things.

I'm not sure about the current 3.17 tests, I have to revisit them again, but have to do some other things today.
Sure, keep flop, but you need to address it's comment:
~~~java
// don't use the name `fail` as it would collide with other `fail` definitions like the one in scalatest's traits
  public void flop(String msg) {
    try {
      fail(msg);
    } catch (Throwable t) {
      asyncErrors.add(t);
    }
  }
~~~