Hey, very nice tutorial... I am working on a heat distortion animation, but unfortunately it is more complicated but doesn't look very good (yet?). Yours is so much easier to do and still looks great... only question I got here: when you're centering the gradient texture on the plane, why add Combine XYZ and Math nodes, when you can simply use Texture Coordinate > Object instead of Generated? The gradient texture is automatically centered and you don't even need a Color Ramp node to get a smoother transition from black to white (if you're not going to tweak it to your desire). Since you're not going to move the center anywhere or do some other texture mapping, your node setup is overkill ;)
It's been quite a while ago that I discovered (per coincidence) the "Object" output is very useful for placing spherical gradient textures in the middle of an object... haven't seen that in any tutorial before (or I didn't notice?). Before that, I only knew you could place a different source e.g. an Empty in the Texure Coordinate's "Object" property field, to manipulate and animate texture mapping or simply to vary the texture between different objects with the same material. Even the Blender manual only focuses on having a different object as source and doesn't say anything about leaving it blank.
Also... you can overcome the pattern overlap by using the random value from the object info node and offsetting some coordinate value, like the x position or even have that random value plugged into one of the inputs for the noise texture.