You're calling the supplier before the objects are registered, resulting in an NPE. Whenever creating constructor methods for registering, it's safest to assume all parameters, except the name, should be supplied instances rather than the raw object.
That totally makes sense to me. I've been hanging back in 1.19.2 for this reason as well. I'm not ready to jump right into 1.19.3 just yet. I only jumped into 1.19 when I did because I really liked some of the changes they had made to datapacks at the time and it didn't feel that hard for me to make the leap, but now that I'm tinkering around with Forge I feel like I have my hands full so I'm more than willing to just take my time for now to figure things out.
I'm really glad you got it all sorted out.
So vanilla does this by using a permutation source asset with generates the overlaid assets on top of one another. You could do the same with a model loader or by creating your own source asset by copying the one in 1.20.