Refactor to enable checking by hash

@tyrope I'm new to python, but not new to programming, would you mind checking this refactor to see if it's reasonable and stylistically pythony? I don't want to go too far down the road without checking in, and I don't want to make any horrible style faux pas. 

**NOTE:** I know this is a refactor, I give you complete permission to tell me to go away and stop bothering you. I hate when people do this to me, but I was having a really hard time understanding the interface and I really want to get some tests running. Both of these things necessitate some refactoring. 

Things I did:
* I tried to minimize the external interface for each of the classes by making most methods private. 
* I also pulled some of the logic out of `main.py` in order to make it responsible for a little less. 

Things I'd like to do:
* Move the `for mod in mods` out of `main.py`. Hopefully we can make main responsible for anything that's not testable.
* Make the comparator capable of comparing based on hash instead of version number. But that's going to require a separate service so it's a lot bigger. 
* Add tests