Fix check for valid file pointer before fprintf

- Bug: Prior to this change there were no braces around the if statement
that checked the validity of the file pointer so only the first fprintf
call was protected from being passed an invalid file pointer.
Add timestamps to log output
Many bugfixes, enhance logging, loop worker option

- Add support for old MinGW compilers.
The original MinGW project has includes that are missing some required
items like TOKEN_ADJUST_SESSIONID.

- Add advapi32 lib pragma for VS compilers.

- Fix Unicode build errors.
Although it appears the author's intent was to offer a choice to build
ANSI or Unicode, prior to this change the Unicode build did not compile.

- Change ServiceMain and ControlHandlerEx to WINAPI (__stdcall).
Prior to this change both functions were incorrectly of type __cdecl.

- Fix other compiler warnings.
Use type prefix I32 (eg %I32u) to print DWORDs.

- Implement proper cleanup for WorkerThread and ServiceMain.
Take care that all variables are initialized and de-initialized properly.
Ensure that any invalid handle is set to INVALID_HANDLE_VALUE and test
against that value before closing a handle.

- Serialize logging.
Prior to this change logging wasn't thread safe.

- New function macro logf_gle.
Like logf to log but also call GetLastError() and include the result in
the log entry.

- Add timestamps to log entries.

- Add build option via define LOOP_WORKER to loop the worker thread.
Prior to this change the only behavior was that the service stopped
after executing the target process in the session that was next
connected to. Now if built with LOOP_WORKER the worker thread loops and
for each console connection made the target process is executed in the
respective session.

- Update README.md.
Include some basic info, known issues and Winlogon references.