The conversion to and from property descriptors doesn’t only look at
own properties, so it is convenient to create ones with a null
prototype (to prevent attempts at hacking into, e·g,
`Object.prototype`). This means the existing class‐based approach
isn’t viable and a more functional approach is better.
Many of the property descriptor functions explicitly handle undefined,
so treating them as values and not objects makes sense, even if some
(`completePropertyDescriptor`, `toPropertyDescriptor`) throw if their
argument is not an object.