Community Detection in Networks: understanding the fundamental limits of polynomial-time algorithms