init: wait for and reap all child processes in init, exit properly in preloadd
process: fix an awful race condition where sometimes waitpid would be woken up and see a process not yet actually a zombie, and go back to sleep again.
posix: fix a minor logic error with waitpid that caused waitpid(-1, ...) to fail if child processes weren't part of a process group

Technically this is actually reavealing a bug with fork/exec in that the
process group of the parent is not passed down (so waitpid(0, ...) should
actually work), but waitpid(-1, ...) is specified to wait for _any_ child
process - which means we should handle children in different groups,
and without groups.