It's possible for require/do to grab FD 0 and not let go. C.f.
When CT finds STDIN closed and opens a proxy to use to set up forks in a
child, it should check for FD 0. If STDIN is not on FD 0, CT should dup
FD 0, close FD 0, open STDIN to FD 0, do what it needs to do, then
restore FD 0 as it was... if possible.