Are we sure fan_in and fan_out will always be needed? (and if not needed, that they'll be trivial to calculate for every layer?)

I suspect it could make more sense to have an interface that gives access to a few layers, and then those layers can implement things like get_fan_in, get_fan_out, etc. so the initializer can call only the ones that are needed.