Major refactor

In this PR we refactor several things:
* Move everything possible up to the root `GraphAnalyzer` class.
    - This includes `init()` and `printSPInfo(startNode)`.
    - We had to use generics and a little constructor magic to be able to properly initialize the node info hash map.
* Add a BFS algorithm and refactor `UnweightedGraphAnalyzer` into a `BFSForCentrality` class. This is more logical considering how `WeightedGraphAnalyzer` is organized.
* These changes required a refactor of `NodeBetweennessInfo` and `PathLengthData` into their (un)weighted versions so that we could use either ints or doubles for distances. This removes a lot of confusion about the difference between distances and steps.