'Create an unmanaged Candidate for a tunnel mechanism with a certain address
This avoids candidates being disassociated while they are being used in notifications.
:param tunnel: the tunnel object being used
:type tunnel: Circuit or RelayRoute or TunnelExitSocket
:param sock_addr: the socket address of the candidate
:type sock_addr: tuple
:return: the immutable Candidate object
:rtype: Candidate'

def copy_shallow_candidate(self, tunnel, sock_addr):

    assert isinstance(sock_addr, tuple), type(sock_addr)
    assert (len(sock_addr) == 2), sock_addr
    assert (isinstance(tunnel, Circuit) or isinstance(tunnel, RelayRoute) or isinstance(tunnel, TunnelExitSocket))
    candidate = Candidate(sock_addr, True)
    member = self.dispersy.get_member(mid=tunnel.mid.decode('hex'))
    candidate.associate(member)
    return candidate
