NULL completionQueue shouldn't dispatch to the main queue

This also changes the default value of the completionQueue to the main queue.

NULL should mean we don't dispatch to another queue. Instead run the block on our own private queue. This will prevent having to dispatch onto the main queue to then dispatch to other private queues. For example, when using Core Data:

```objective-c
[managedObjectContext performBlock:^{}];
```

The default behaviour would mean wasting a run-loop cycle to get to main queue and then dispatch back off using another cycle on a different queue.