Fatal errors are now exceptions plus some cross platform updates.

After much though I decided I wasn't a fan of the Robo errors.
The issue is that you can return the error but not everyone will use
wasSuccessful() thus allowing the next task to run even though more
than likely it relies on the first task having completed successfully.

So now all fatal errors are now exceptions. Anything that is none fatal.
For example cleaning up temp files, will return a robo error object.

In this update we also have made sure our tasks are as cross platform
friendly as possible. All temp files are created by using something like
```tempnam(sys_get_temp_dir())```.