Use a function to compare primitive types for overload closeness

This replaces the "crescent" method, which was hard to predict, sometimes made poor choices, and could result in clashes.
The basic order is:
 - (prefer non-bitfield/enum/zstring/wstring)
 - prefer same dataclass
 - prefer a type that's at least as large
 - prefer the closest type in size
 - prefer [U]Integer over [U]Long/[U]Longint on a tiebreak
 - prefer same signedness
tests: Update test case for 9b1044de (forgotten)
symbTypeToStr(): Don't mistake sizeof(z/wstring) for N in z/wstring * N

The problem is that the "length" associated with data types can mean either
a symbol's length or the data type's sizeof().

For example, a <zstring * 32> variable will have length=32, but a
<*cptr( zstring ptr, ... )> expression can only use sizeof(zstring) as
the length. Array sizes and string lengths aren't encoded in the data
type currently, only in the FBSYMBOL. Expressions only have the data type
though.

This patch adjusted symbTypeToStr() and other functions to distinguish
that, so #print typeof() output will be more precise:

#print typeof( *zstringptr  )  ->  ZSTRING      (instead of ZSTRING * 1)
#print typeof( zstring * 1  )  ->  ZSTRING * 1  (no change)
#print typeof( zstring * 32 )  ->  ZSTRING * 32 (no change)