Fixed #20161: URLs with "0" as host fail to normalize with empty path

A missing type check in normalize() on the host component leads
to a wrong result when the path component is empty.

The two URLs <http://0/> and <http://0> are not compared as
equivalent.

This has been fixed.

Steps done:

- Added test-data or testNormalize() that covers this case
- Fixed Bug #20161 in NetURL2::normalize()
Imp: Change order back to front in _isFragmentOnly()

Ordered the compare.

Additionally PHPMD is not able to see the use of this private function because it is not
used with $this. Therefore and annotation has been added to help PHPMD.
New: NetURL2::removeDotSegments() emits a warning on loop limit reach

NetURL2::removeDotSegments() contains a limit of iterations done. When
this limit is reached, a warning has been added to inform about that.

Currently the limit is 100 iterations. This will be raised after
more tests for that function have been added remove dot segments in
more than 100 path segments.

This change makes also a flaw with a type check visible that was intro-
duced in fb91fb772cfe4008bac44bc28ae547be04f96fdb .
Fix: NetURL2::removeDotSegments() substr failure to comply

PHPs substr() can not obtain a zero-length string from the end of the
string, instead it handles this as a failure as the input-parameter of
the start offset seems too high.

As  NetURL2::removeDotSegments() uses more strict type-checks since
fb91fb7 this resulted in a flaw in the internal order of
removeDotSegments main loop due to a the typecheck change introduced.

Previously FALSE returned by substr() did exit the loop, this was
not the case any longer. This has been fixed.

This flaw was made visible by adding the warning message on loop limit
reach.
Imp: NetURL2::removeDotSegments()

- strict compare
- loop/if/else complexity