ClassUtils: factor out Type conversion methods

The ClassUtils type conversion methods (e.g. convert, canConvert, cast,
canCast) are scoped beyond just literal "Class" objects. For example it
would be useful to have these methods that operate on actual "Type"
objects as well.

Thus the current methods were split out to a new class: ConversionUtils.
The old signatures in ClassUtils are marked deprecated and can be
removed when API consumption is updated.
ConversionUtils: add "Type" convert signature

Added a convert method to ConversionUtils that operates on Type objects
instead of just classes.

This allows the conveying of considerably more information about the
object to convert. Previously, it was only possible to convert single,
non-parameterized types.

By using the actual Type object we can now look for collections and
arrays of objects (multi-element containers). If a multi-element object
is detected, its potential value is interpreted as a list of values.
Each is then recursively converted to its appropriate type.

The ClassUtils.setValue method has been updated to use the new
Type-based signature instead of just the Class convert. If the field to
set is a single-element object, the behavior is unchanged.