Tackling Over-Smoothing for General Graph Convolutional Networks