Updates to runners and exceptions

As I was reviewing the runner-parts of the code, it still felt like a bit of a mess. Mostly left over from the past and made even a bit messier by the new runner functionality. So I cleaned it up a bit.

Major changes:

- Much more functionality has been moved to `base_runner`, so that running of the experiment is no longer handled in the main `qtopensesame.py`.
- I cleaned up the `multiprocess_runner` and the `process` module. I think I understand the mechanism, but please check whether I didn't screw anything up. I also removed a number of `try ... except ...` statements which seemed to be there for no good reason. Note that excessive use of `try ... except ...` makes code hard to debug.
- I migrated *all* exceptions to a new `osexceptions` class. The idea is that this uniform exception framework should lead to more nicely formatted exceptions and more predictable behavior. This is quite a big change, which I have implemented partly automatically, so beware of any bugs here. But I think it needed to be done.

Questions:

- I marked a few questions in `process.py` with a `# TODO`. Basically, these bit should be commented better, because there function isn't obvious (to me).