Techniques For Characterizing The Data Movement Complexity Of Computations