Pretty big overhaul of the structure of the program

I decided that the content provider was way too abstract for its own
good. So I took Ben's CommThread idea and just abstracted it a little
more to hide the annoyances of threading. Now all the communication is
done implicitly in a background thread and all of the results are given
on the UI thread.