Change to use GCD rather than NSOperations

Also simplified and slightly changed towards functional style (passing required arguments rather than holding state in the objects) and changed to purer Swift (possibly at a performance cost but I didn't really record the original performance.