Reuse package dependencies in setup.py

Package information was duplicated in requirements.txt and setup.py. This change introduces a parse_requirements function that allows separating packages in requirements.txt into sections, and then using those sections in setup.py, achieving DRY.