A lot of work on GUI

I have fixed some stuff and added some more new stuff. All in all the GUI code is quickly closing the feature gap with command line.
If I'm reading this correctly, then if we download a file and it errors, we may never set `downloader` to null, and we end up with a stuck transaction.

It might make sense for us to have two different flag values for `downloader`, an `OK` (which means we've installed everything and are done, so commit the transaction), and a `NOT_OK`, which means we should rollback the transaction and bail out.

Then if we are watching `download`, we can take action when we see a flag raised.

(Or if we end up using a mutex, we set the flag, and then twiddle the mutex).