WIP Almost complete refactoring and unit testing of routingtable. Minor refactoring of kbucket.

Very WIP. I will describe tomorrow; really tired now.

### Bugs found:
* Many operations are potentially thread-unsafe.
* The `replacement_cache` isn't synchronized once a `KBucket` is split.
this probably needs a bit more work as it won't behave as documented, by taking a look at `kbucketIndex(node_id)`

```
def get_contact(self, node_id):
    """
    Return the known node with the specified ID, None if not found.
    For details, see RoutingTable documentation.
    """
    bucket_index = -1
    try:
        bucket_index = self.kbucketIndex(node_id)
    except KeyError:
        return None
    except RuntimeError, e:
        raise e

    bucket  = self.buckets[bucket_index]
    if bucket is not None:
```