Heavy refactoring (see extended description)

- Moved all non-CLI functions (with the exception of the
euler_options() decorator) to utils.py
- Wrote a Problem() object that is initialized with the Project Euler
problem number as an argument that can return various problem properties
- Rewrote tests accordingly