Creates a lazy-loading ghost instance.
When the initializer is a closure, it should initialize all properties at
once and is given the instance to initialize as argument.
When the initializer is an array of closures, it should be indexed by
properties and closures should accept 4 arguments: the instance to
initialize, the property to initialize, its write-scope, and its default
value. Each closure should return the value of the corresponding property.
The special "\0" key can be used to define a closure that returns all
properties at once when full-initialization is needed; it takes the
instance and its default properties as arguments.
Properties should be indexed by their array-cast name, see
https://php.net/manual/language.types.array#language.types.array.casting