introduce file_descriptor and pipe RAII types to be used in run_process
use pipe wrapper in run_process for stdin
use pipe wrapper for error propagation
propagate dup2 errors from the child to the parent