Refactor node/kbucket.

### Changelog:
* Leverage `Contact.__eq__` to remove and exclude contacts directly via Python's `list.remove()`.
* Avoid re-building list when removing contact; delete in-place.
* Raise `ValueError` if contact to be removed is absent from bucket. Fix #535 and enable relevant test.
* Groom code and docstrings a little.
* Remove execute flag from file.

(Please review; I 'll squash PR afterwards.)
if this remove raises an exception (when the element didn't exist), then the self.contacts.append(contact) below won't be executed. (not sure if this was fixed on later commits, just wanted to point out these two statements should probably be inside different try/catch blocks)