This is another attempt to re-use the code in `Payload.reserve` --
similar to https://github.com/dlang/phobos/pull/8143 (commit 0b7bf8dc):
"std.container.Array: Simplify implementation of length (by calling reserve).".
Additionally, `Array`'s variadic constructor is now safer:
If `emplace`-ing an element fails, successfully `emplace`-d elements are now destroyed.
Example:
```
auto a = Array!S (S(0), S(1), S(2), S(3));
// If emplace-ing a[2] (as a copy of S(2)) fails:
// - pre-existing behaviour: a[1] and a[0] were not destroyed (bad);
// - new behaviour: a[1] and a[0] are destroyed (good).
```
A corresponding `unittest` has been added (`S.s_nDestroyed == S.s_nConstructed`):
When such a failure (`Exception`) is caught, there should be no leaked objects.
Implementation:
Previously:
- the `Payload` `length` used to be increased only once,
after having successfully `emplace`-d all elements,
thus incorrectly tracking the number of `emplace`-d elements during the loop
(but correctly tracking it after the loop -- iff the entire loop succeeded).
Now:
- the `Payload` `length` is incremented multiple times,
at each step i.e. after having successfully `emplace`-d each element,
thus correctly tracking the number of `emplace`-d elements during the loop.
Note:
When the constructor fails, the corresponding destructor is not run.
But the destructors for successfully constructed sub-objects are run;
in this case, the destructor for the `_data` sub-object is run --
and it is this destructor which destroys the successfully emplaced elements
(iff they have been correctly tracked).