lib/services: use self-pipe sigchld handling when signalfd isn't available
This allows child processes to be spawned with services_os_action_execute()
on non-Linux platforms using the self-pipe trick. The only functional
change this adds on Linux is to cleanup the SIGCHLD blocking when fork() fails
and in the created child process.
It might be better to use libevent for this but rather than start to add new
dependencies this just adds a generic fix which should be supported across
multiple platforms.