OP here - I was going to go into that - it's an interesting story. There are null references, as you say, but there's also the null object pattern and the null type. I decided to just focus on the idea of null, which all three of those things represent. A pointer points to a null space, a type represents a value that can optionally be null, and the object pattern allows you to deal with null in your program directly (like Ruby's nil).
So... yeah I dig it man :) I just left some things out to keep on a pace.
I feel like the idea of null is fine, but the implementations are idiosyncratic.
Null is an unknown/unknowable/invalid value.
You can't know if null = null. This should be an exception or other error.
You can't know if 10 = null. Null is unknown. It might be 10, it might not. This should be an exception or other error.
You can't have a meaningful result of 10 * null. A pointer to null is meaningless.
Languages which lack a way to signify an error other than null can be an issue. Most modern languages have option types and/or exceptions, both of which provide good ways to deal with error conditions.
So... yeah I dig it man :) I just left some things out to keep on a pace.