Many fixes for getarg.

getarg did not handle pointer alignment correctly. For example a bool
parameter such as used by gifecho might only require alignment of 1,
while Parameters are currently stored as integers which have an
alignments typically of 4 bytes. On some architectures assigning a
misaligned pointer (even if not accessed as such) triggers an
alignment fault and halts the program. The correct solution is to use
pointers to void.

This patch that fixes this and a couple other problems I discovered
along the way. Oh note, that one of the fixes included fixes a memory
read after freed issue though I don't know if any current utility uses
it.

Change summary:

    Fix pointer alignment issues.

    I've simplified the argc handling. There were a some paths that
    could have miscounted argc.

    float argument processing had a bug which caused it to also
    process an extra double parameter right after it.

    multiple arguments *? freed the array before returning it to the
    caller. Which meant that freed memory was accessed. This probably
    needs frees added where such a pattern is used, but small memory
    leaks in command argument processing is not really an issue for
    short lived utility commands vs. dereferencing freed memory.

    many of the pointer assignments were hidden behind memcpy which
    prevents memory correctness tools from being able to pin point the
    other bugs.