Use a signal fd

Instead of updating a global variable whenever a signal is received,
write signals to a pipe from the signal handler. This simplifies the
event loop by using poll to notify of signal events.

There is still a bunch of clean up to do:
* signals should be blocked before fork/clone is called and unblocked
  after

  There is a window after the child is forked, before the child has
  opened a sigpipe, where the parent and child share the same signal
  fd's. If the child is sent a signal during this window, the parent may
  read it from the pipe.

* signals may need to be blocked/unblocked in the signal event handling

* shuffling around alcove fd's (write signalfd, read signalfd, control fd)

* duplicated code in main/alcove_fork to open alcove fd's. Break up the
  code and move to functions.