public byte[] Serialise(ProxyContact.IProxy proxy)
        {
            MemoryStream m = new MemoryStream();
            Serializer.Serialize<UdpProxy>(m, (UdpProxy)proxy);

            return m.ToArray();
        }
        public ProxyContact.IProxy Deserialise(byte[] data, ProxyContact contact)
        {
            var d = Serializer.Deserialize<UdpProxy>(new MemoryStream(data));

            proxies[d.EndPoint] = new KeyValuePair<ProxyContact, UdpProxy>(contact, d);

            return d;
        }
        public Callback.WaitToken SendPing(ProxyContact source, UdpProxy destination, bool synchronous=true)
        {
            var t = callback.AllocateToken();

            MemoryStream m = new MemoryStream();
            Serializer.SerializeWithLengthPrefix<ProxyContact>(m, source, PrefixStyle.Base128);

            m.WriteByte(0);

            BinaryWriter writer = new BinaryWriter(m);
            writer.Write(t.Id);

            Send(m.ToArray(), destination.EndPoint, synchronous);

            return t;
        }