Make Exception's constructor behave like PHP's

This adjusts behavior of Exception::__construct to match PHP in the following cases:
- default values do not override property defaults (subclasses may explicitly change property values);
- compatible parameters' types of different type are converted to their correct type;
- invalid parameters throw a fatal error.

closes #3603, closes #4379, fixes #4125