A Critical Review of Information Bottleneck Theory and its Applications to Deep Learning