Fix issues that GroupBy and Sample doesn't call 'unsubscribe' and also NPE when the key is null in GroupBy

Fix #1958
Not really. I'd do
```
volatile int wip = 1;
...
@Override
public void call() {
    if (WIP.decrementAndGet(this) == 0) {
        self.unsubscribe();
    }
}

... createNewGroup()
int w = wip;
if (w > 0 && WIP.compareAndSwap(this, w, w + 1)) {
  groups.putIfAbsent(key, groupState);
  ...
} else {
  return null;
}

...completeInner() {
...
if (WIP.decrementAndGet(this) == 0) {
    unsubscribe();
}   
```

In words, start out wip as 1 because there is the main subscription. Each group created ++wip conditionally: if wip = 0 then an unsubscription happened and there was no active group and thus don't create a new group. Once each group terminates or gets unsubscribed, --wip and if it reaches zero, upstream is unsubscribed. This of course assuming completeInner is idempotent per group.