Ensure exec() returns before any signals

After exec() is called, wait for the control fd to be closed. If a
signal is received, it will be queued in the process mailbox.

This change may seem racy because, during the window between the erlang
process requesting exec() and the unix process performing the exec(),
the unix process could receive a signal. If this occurred, the control
fd will become ready and the parent will send an fdctl_closed event on
behalf of the child.