Move key and ref to descriptor and read from there

I think this probably makes sense; you could imagine a different factory that took key and ref separately from the props.

Test Plan: grunt test