Added 'fatal' logging/exit function and '--failsafe' option.

Now, any time there is a fatal error, we call 'fatal()' with an exit code and
message.  Under normal circumstances, we print the message and exit, but if
we're running as process 1, or if the user requests --failsafe, then we print
the error with a note that we're going to try to continue, and recover as best
we can.

A future commit will add support for exec() on fatal errors, to drop to a
cleanup script (which would even be used when runing as init)
Replaced bloated logging functions with a simpler implementation

The other design seemed like a neat idea at the time, but this is
just as efficient and 1/3 the code.
implemented exec-on-exit, and cleaned up exit codes

init-frame now has the option to run another program instead of exiting.

Also rearranged a lot of the option processing and it is simpler now.
Enhanced signal handling to trap fatal signals and call fatal()

This allows exec-on-exit to happen for segfaults and similar.