Routing Table changes and general debugging/diagnostic overhaul

D2TreeCore.java
* As a result of leaves having links for both the first and the last bucket node, joins don't have to iterate through all the bucket nodes to reach the last one. That means that joins are mostly done on leaves.
* The initial process goes like this now: join request (leaf) -> join response (new node) and join request (leaf) -> check balance (leaf)
* Diagnostic overhaul.
* It's no longer obligatory for findRTInconsistencies to print errors. It also returns a list of all the discrepancies.
* Added a method that takes a list of roles as a parameter and checks whether they've changed in a way that creates discrepancies.

D2Tree.java
* D2TreeCore.findRTInconsistencies is called before and after each operation to find out if there are any discrepancies. The results are printed out. This is an important breakthrough in the department of diagnostic messages.

D2TreeMessageT.java
* added JOIN_RES and PRINT_ERR_MSG types.

JoinResponse.java
* Newly added.

RoutingTable.java
* Added static methods Role mirrorRole(Role role) and Role mirrorRole2(Role role) in enum Role, which return the reverse of "role". Used to find out discrepancies in the routing table between peers.
* Leaves now maintain links to both the first and the last node of their buckets, as opposed to just the first. Appropriate modifications have been made to reflect this.
* Left and right routing tables are now printed as one.

CheckBalanceRequest.java
* formatting changes