Coming from https://github.com/ramsey/uuid/pull/603, this is an attempt
to fix the errors raised by the current phpstan settings.
I went through each of the errors raised by phpstan with the following
approach.
- If a method is part of an `@immutable` class, we can consider it pure,
assuming it only affects internal variables.
- If a potentially pure method is calling a class's method that is only
swapped during testing (and not during normal usage), then we can
consider the calling method pure.
- If a class is marked deprecated, don't bother with attempting to mark
it pure or immutable.
With this change, `Uuid::uuid1()`, `Uuid::uuid2()` and so forth now produce a `LazyUuidFromString` instance, which
is both more memory efficient and comparable to `Uuid::fromString()` instances in other tools, such as within
PHPUnit's `Assertion::assertEqual()`, which would reject any two objects not matching each other's types.
Before this patch, `Assertion::assertEquals(Uuid::uuid5(...), Uuid::fromString(...))` would always fail due to
different subtypes produced by the two factory methods.