Potential for Stuck Funds with `msg.value` in Initializer
The `ERC1967Utils.upgradeToAndCall` function, when called with `data` (e.g., for initialization), allows `msg.value` to be forwarded to the implementation via `Address.functionDelegateCall`. If the target function in the implementation is not `payable` or does not properly handle received `msg.value`, any Ether sent during deployment or upgrade with initialization data could become permanently stuck in the implementation contract. While `_checkNonPayable()` prevents `msg.value` if `data` is empty, the case with `data` requires developer vigilance. (Coverage: 7.2 Code Security, 7.4 Economic)