Change _insert_tasks to use add_async

In `_insert_tasks()`, we now add each task individually using
`Queue.add_async()`, instead of all at once with `Queue.add()`. This allows
us to insert each task only once and not have to worry about splitting
and retrying until we find the bad tasks. Unfortunately this method
prevents us from determining exactly how many tasks were successfully
inserted. This will help however when a large number of duplicated tasks
are trying to be added and it keeps splitting instead of just quitting.