Fix incorrect use of va_end

There were two cases in which we were calling va_end with a va_list
variable that was an original, not a copy. When two such calls were made
in succession on Windows, the second would fail as the pointer would no
longer be valid. This was not happening under OS X or Linux due to the
different way in which these platforms implement the stdarg macros.
Win32: Avoid __attribute__ in VC++

Visual C++ doesn't seem to support the __attribute__ declarations on
struct members or functions - at least not when compiling in C99 mode.

Define macros for the two that we use (struct member alignment and
function format string handling) and have these expand to nothing when
compiling with VC++.