Create product collection for efficient processing

- Create `ProductCollection`, especially `.get`.
- Clean up code
- Extract repeated code into modules and superclass