I wanted to follow up on this point, which I forgot to do:
I *thought* I was facing the same issue with load. When I'm writing functions, I have the same challenges: we don't have anything like "interfaces" and we're not supposed to check type because that's "bad"i. So, I've generally given up on the sort of flexibility that you've demonstrated here, in favor of either no flexibility or flexibility encapsulated into a single "args" table.
I can't make comprehensible function arguments that are also flexible and I don't think I'm alone.