This is a little bit slow and inefficient (browser only), and I did not come up with this idea. The concept was covered in greater depth in one of The Coding Train's videos: https://youtu.be/X0kjv0MozuY
Also, I am aware of the bug (now fixed) that every once in a while, a weird black line appears in the fire. That happens because the smoothing algorithm applied on the cooling map doesn't work on the edges, and I was too lazy to implement it because of "indexing out of bounds" and "attempting arithmetic on a nil value" errors :p
UPDATE: Actually, it is only slow when running in the browser: in the client it is really smooth. It also isn't as inefficient as I thought it was. And finally, I fixed the bug with the weird gaps on the edges using MATHS! Thank you, modulus operator! :D