Duh. Its so obvious when you know what it is
Of course, the issue was run_job is running ParallelJob, while create_job for the device is running in order. It clearly answers my original question of how to get it added to the queue at the end, even if we went round the houses for a while. Not that I would have found it myself.
So now book sync runs upload books, create_collections is queued behind it, and when book sync finishes it queues the send metadata behind my create collections (which isn't an issue as I read from the books not the cache file).
Now I just have to re-arrange my dialogs so they are separate from the device job (temporarily removed and just using prints for this test), and work out how to get he progress indicator to say 0% not 100% done until its finished (may not try to get it to show progress as it runs as there's no clear way to count, but who knows.), and see if I should make some other parts into jobs.
Thanks again.