Avoid "dangling else" compiler warnings

By wrapping some macros in a do { } while (0) construct.
Fix compiler warnings in operands.c

branchVal is used as the destination for a pointer to signed integer.
GCC really dislikes the old encode/decode float routines

"dereferencing type-punned pointer will break strict-aliasing rules"

Just use memcpy instead. It will generate equivalent code on any
modern compiler.
Unused variable chunkStart
Annotate possibly unused variables and functions

- get_game_id: only used with some Glk implementations
- glulxPC and glulxOpcode: only used in commented-out debugging code
Optimized memory access code.

- Use memcpy as a portable way to request an unaligned read
- Use GCC/clang compiler intrinsics for byte swapping
  [This might need some tuning for Visual Studio]

This change makes the USE_BIG_ENDIAN define required on big-endian
systems.  (Previously, it was only a performance hint.)
Introduce readtag function

read32 is now a function instead of a macro, and so we get
warnings when trying to pass pointers to chars of the wrong
signedness... Introduce a readtag function that can be used
for readtag("MAll") constructs.
Specialized binary search implementations

Add specialized binary search implementations for 16 bit and 32
bit keys. (16 bit keys are extremely common. 32 bit are not, but
providing the optimized version now will prevent a performance
drop if 16 bit keys turn out to be too small in the future.)

On my Counterfeit Monkey benchmark, this gives a 13% improvement
for gcc-4.9 -O2 but only 3% improvement for clang-3.4 -O2. I don't
understand why clang does so poorly.
Declare error routines as noreturn

10% win with clang, 7% with GCC

Visual Studio define provided but untested
Rearrange buffers for faster Glulx memory access.

The original code used two buffers to store Glulx memory:
  gRom: ROM + the initial contents of RAM (potentially memory-mapped)
  gRam: the current contents of RAM only

As a consequence every memory access needed a test to discover
which buffer to use, which is rather unfortunate.

This patch reorganizes the buffers as follows:
  gInitMem: the initial memory contents, same as gRom
  gMem: ROM + the current contents of RAM

Typical ROM size of a Glulx game seems to be between 200 kilobyte
and 2 megabyte, so the extra memory cost is quite reasonable.
Cheaper block cache accounting

The runCounter field is used to determine which blocks to retain
during a cache flush. This field counted the number of times an
instruction from the block was executed.

It is simpler and more effective to just count how many time a
block was retrieved from the cache. This reduces the number of
cache flushes and removes an expression from the inner interpreter
loop as well.