Properly compare assembly versions when performing binding. Fixes #17368.

The right way to compare assembly versions is by translating the major/minor
pair into a single number and compare that.

Since each element can only be one byte long, we multiply major by 256
before adding to minor.

This solves the problem where version 100.0.0.0 was not after 3.5.0.0.
[Microsoft.Build.Engine] Fix the escaping/unescaping of FullPath metadata

It is incorrect to escape the FullPath metadata for a build item when
we invoke GetEvaluatedMetadata. If we do this we end up completely breaking
every file with a special character in it as things like this would always
fail as we'd pass an escaped path to the filesystem:
	File.Exists (item.GetEvaluatedMetadata ("FullPath"))

The iOS designer encountered this issue when we added retina images
called "foo@2x.png" to our solution.

With tests.
[Microsoft.Build.Utilities] Fix the escaping/unescaping of ItemSpec

This should hopefully fix compilation of projects using files with
names like 'foo@2x.png' in various places like embedded resources
or content items which must be copied to the output directory.

With tests.
[Microsoft.Build.Utilities] Properly escape/unescape ItemSpec

With tests.