* Sync up to Seattle's r7220 (use cachedadvertise/advertisepipe instead of AdvertiseObject, give more verbose errors, random.random_shuffle instead of random.random_sample)
* Make errors in constructing the stack, contacting the forwarder etc. raise exceptions instead of silently retrying or even falling back to non-NatPunch'ed operation. ``Explicit is better than implicit,''  and in our case implicity resulted in listening on the private IP address (and never getting incoming connections from the public Internet), and lots of DuplicateTupleErrors.
* Syncing up to Seattle's r7259 (no ``import traceback'' in Repy!) and r7338 (NAT_FORWARDER_KEY shouldn't be a list). Also, use cachedadvertise/advertisepipe instead of AdvertiseObject.
* Removed Affixes from the control connection to the forwarder. WARNING, this requires (small) additional changes to nat_forwarder.repy to also not use Affixes.
* Removed the reconnection logic when the forwarder connection breaks down. Retrying only gave us DuplicateTupleErrors (as we didn't change our source port!), and made it impossible to detect for our caller that we weren't listening using the old forwarder anymore.
* Raise lots of exceptions. Not all of them feel totally fitting, but the Repy network API only allows (and programmers consequently expect) only certain exceptions in certain situations. Staying silent is not an option however. We must inform our caller when things go very wrong.
* Replaced the retrieve_random_tcp_port logic by a loop that tries each available connport. See Seattle's r7150/7150 for the blueprint.

TODO: I left a few additional debug statements in the code. These aren't strictly required/interesting and should be removed before a production push.
Completing the previous commit. Also removed a few of the mentioned debug messages.