Potential fix for 'exec' failure case

 - Adding more robust code to handle the case where the exec call within fails. Now, spawn will raise an exception if this happens.
 - Adding a test to ensure this exception is raised when an invalid binary is run
The upshot being: I think this is OK, but to be safe I might do something like this:

```python
errbytes = str(err).encode('utf-8') if PY3 else str(err)
os.write(write_end, errbytes)
```

And then on the receiving end, `data.decode('utf-8', 'replace')`, just to be on the safe side.