The issue was a closure problem where the on_child_death callback
referenced a responder variable that was created after do_launch()
was called. This caused the callback to fail when the child process
exited because responder didn't exist in the callback's closure.
The fix creates the responder before defining the callback and adds
a null check in the callback to ensure it exists before using it.
This allows commands like:
kitten @ launch --type=overlay --wait-for-child-to-exit bash -c "echo test"
to properly wait for the child process to exit and return the exit code.