Workers can throw checked exceptions

I've also taken the chance to refactor the worker out into its own project, where it should already have been!

This solves issue #25