message: network-core: More methods and impls on Gossip
  Implement Clone and Debug for Gossip.
  Add method Gossip::into_nodes to move a Gossip value into an iterator
  of Node values.
diff: use chain_core::property::{Deserialize, Serialize};
  -use std::{iter::FromIterator, net::SocketAddr};
  +use std::{
  + iter::{DoubleEndedIterator, FromIterator, FusedIterator},
  + net::SocketAddr,
  + vec,
  +};
  /// Marker trait for the type representing a node ID.
  pub trait NodeId: Serialize + Deserialize {}
  @@ -17,6 +21,7 @@ pub trait Node: Serialize + Deserialize {
  fn address(&self) -> Option<SocketAddr>;
  }
  +#[derive(Clone, Debug)]
  pub struct Gossip<T: Node> {
  sender: T::Id,
  nodes: Vec<T>,
  @@ -40,4 +45,36 @@ impl<T: Node> Gossip<T> {
  pub fn nodes(&self) -> &[T] {
  &self.nodes
  }
  +
  + pub fn into_nodes(self) -> IntoNodes<T> {
  + IntoNodes {
  + inner: self.nodes.into_iter(),
  + }
  + }
  +}
  +
  +#[derive(Clone, Debug)]
  +pub struct IntoNodes<T> {
  + inner: vec::IntoIter<T>,
  +}
  +
  +impl<T> Iterator for IntoNodes<T> {
  + type Item = T;
  +
  + fn next(&mut self) -> Option<T> {
  + self.inner.next()
  }
  +
  + fn size_hint(&self) -> (usize, Option<usize>) {
  + self.inner.size_hint()
  + }
  +}
  +
  +impl<T> DoubleEndedIterator for IntoNodes<T> {
  + fn next_back(&mut self) -> Option<T> {
  + self.inner.next_back()
  + }
  +}
  +
  +impl<T> ExactSizeIterator for IntoNodes<T> {}
  +impl<T> FusedIterator for IntoNodes<T> {}
  