Various fixes

This needs to be like bash:

```bash
$ echo > /var/log/error.log | echo test
test
bash: /var/log/error.log: Permission denied

 $ echo > /var/log/error.log && echo test
bash: /var/log/error.log: Permission denied
```

Have setup_io() raise an `IoRedirectionError` that contains the path to the file and the error message. In shell.py, catch the error, set `rc` = `-1` and print the message to `real_stderr`. Repeat for stderr and stdin here.