This is not quite a true leak since the garbage collector will
reclaim everything when it runs, but it might as well be a leak
because CPython's garbage collector uses heuristics based on the
number of allocated objects to decide when to run. Since this
scenario resulted in a small number of very large objects, the process
could consume a large amount of memory.
The actual change is to ensure that HTTPConnection always sets a
close_callback on the IOStream instead of waiting for the Application
to set one. I also nulled out a few more references to break up cycles.