Diffusion adaptation strategies for distributed optimization and learning over networks