Don't mangle the packet list while we're walking over it.

Instead, mark the request as done.  Then, because the requests
are parented to the listener... they'll get free'd when the
listener is free'd.

We should probably change this so that the packet list takes
a free function.  Then, when we delete an entry from the list,
the request is automatically marked as free.