Simple wrapper around System.Diagnostics.Process to expose it as a System.Threading.Tasks.Task<ProcessResults>
Includes support for cancellation, timeout (via cancellation), and exposes the standard output, standard error, and exit code of the process.