Refactor routingtable and kbucket (part 2)

### Motivation
Further clean and test the `routingtable.py` module. Do some of the work outlined in #730.

### Changelog
* Delegate splitting to the `KBucket`. This allows better encapsulation, and, you guessed it, better tests.
* Create and test `MemKBucket` class, representing a `KBucket` with a replacement cache.
* Protect access to a `KBucket` via a recursive lock; it is now a thread-safe object.
* Drop `TreeRoutingTable` in favour of `OptimizedTreeRoutingTable`. The latter uses `MemKBucket`s and can cache contacts.
* Fix a bug in `findCloseNodes`.
* Push test coverage for `OptimizedRoutingTable` to 100%, by porting tests from the [drogulus](https://github.com/ntoll/drogulus/tree/master/tests) project.

### Note
* The diff is large, but more than half of it are tests. Don't be scared!
* I intend this to be in Beta 3.0, but I won't be working any more on that part of the system. Instead, I 'll try to see how we can replace our Kademlia implementation with `libtorrent`.
The exception cannot be changed: a `list` will throw a `ValueError` on any attempt to remove a non-existent item. Whether the exception is actually an error is a matter of context; in the code above, an exception denotes that the contact was not already present, which is fine.

To avoid the exception, we could check for presence before we removed the item, but it would be slower. We could also roll our own for-loop iterating over the list and it would be even slower. Trying to remove and handling the ocassional `ValueError` is the python way.