Ah, the issue is that we are expecting an idle status after every iopub message per the 5.0 spec: "Changed in version 5.0: Busy and idle messages should be sent before/after handling every request, not just execution." The classic notebook is more lenient because it also supports older protocol versions.
it seems the same problem as the kotlin kernel, https://github.com/jupyterlab/jupyterlab/issues/1604
http://jupyter-client.readthedocs.io/en/latest/messaging.html#kernel-status