Use subprocess for system_raw

Supersedes #4049

This unifies the exit codes from `system_raw` and `system_piped` to use the subprocess model on Unix - positive numbers for exit status, negative for terminating signal.

This doesn't change the situation on Windows. `system_raw` will give the raw exit code (Windows exit statuses don't appear to include the terminating signal), and `system_piped` will give nothing - our process_win32 machinery never gets the exit code, and I don't want to go messing around with that.

I've not figured out a good way to test the terminating signal exit codes, as our main process APIs are blocking. It may require threads...