Major refactoring and bug fixes

* Allows for recursive requirements files (via the -r flag)
* Ignores options set inside the requirements file (besides -r)
* Refactors the code into smaller chunks to make it easier to read/test.