fix(copy): preserve property descriptors

Instead of values being simply copied, this change allows to preserve
definitions of own properties. Thus, enumerable (or not), writable (or
not), getter/setter, etc. property definitions are preserved across copies.

As a side effect, it also includes previously ignored non-enumerable properties
by using `Object.getOwnPropertyNames` to iterate *every* own properties instead
of `for ... in ...` + `hasOwnProperty`.