Make platform independent of lib

Instead of using the DFArrray, DFError, and DFString classes/functions
in the platform directory, stick to standard C types and functions, so
that platform can be built without relying on any headers from lib.

Where we previously reported errors back to the caller using a DFError
object, we now pass back a string containing the error message.

Where we previously used DFArray to dynamically build up a list of
directory entries, we now use the newly-defined PlatformDirEntry struct,
from which we build a linked list. This is slightly easier than
replicating the memory-reallocation logic present in DFArray.

Also, instead of having the directory scanning function operate
recursively, it now just reads the contents of a single directory, and
the logic for traversing child directories is now back in
DFFilesystem.c. This function has also been renamed from
DFAddDirContents to PlatformReadDir.

The only non-system include files used by platform/*.c now are
DFPlatform.h and DFCommon.h. The latter is a general header intended to
bring in common system includes and define macros for making common
functinons like strdup available on windows without requiring them to be
prefixed with an underscore. This header is not part of lib.