lazyObject = obj => {
	const newObj = /** @type {T} */ ({});
	for (const key of Object.keys(obj)) {
		const fn = obj[key];
		Object.defineProperty(newObj, key, {
			get: () => fn(),
			set: v => {
				Object.defineProperty(newObj, key, {
					value: v,
					enumerable: true,
					writable: true
				});
			},
			enumerable: true,
			configurable: true
		});
	}
	return newObj;
}
@template T
Returns a lazy object. The object is lazy in the sense that the properties are
only evaluated when they are accessed. This is only obtained by setting a function as the value for each key.
@param {Record<string, () => T>} obj the object to convert to a lazy access object
@returns {T} the lazy access object