Architecture reorganization

- Moves code into a more standard filesystem layout
- Introduces a `setup.py` file for consistent packaging