cleanup: use IPython's async interface