Template method refactor

Things to take note of:
- Refactoring the stats for different locations in subclass the into separate methods in the superclass.
- For specific algorithm classes, currently solveOne() and solveFirst() methods only have the Stats method different between the two of them. Should we just merge them with the parent method? My preference is to keep them separate anyways for the sake of readability.
- Refactored out bounds from being explicitly passed in as parameters for the solve methods.