testtex enhancements: --nchannels, --derivs

--nchannels lets you force the number of channels to look up (it used to
automatically use the number of channels in the map, and this is still
the default). The purpose is to be able to test when the number of channels
in the lookup differs from the number in the map.

--derivs makes the variety of texture call that looks up derivatives of the
texture as well, and outputs them as two additional images (one for ds,
one for dt). This lets us test that the derivatives are calculated correctly.
OIIO_RESTRICT macro for restricted pointers.

Use on function declarations like this:

    void add1 (float* OIIO_RESTRICT A, const float* OIIO_RESTRICT B)
    {
        A[0] = B[0] + 1.0f;
        A[1] = B[1] + 1.0f;
    }

This means "A and B will never point to the same memory in a way that
could create a data dependency". Without this, it could be that B[1] is
the same memory as A[0], which means that the first line MUST execute
prior to the second in order to be correct, whereas if it knew A and B
would point to distinct memory (or at least would never interfere), the
compiler could be more creative with optimizations because those lines
could be rearranged or run in parallel.

Use with extreme caution!
Basic SIMD support in the form of float4, int4, and mask4 classes
that take advantage of SSE if available.

This is a first stab at it, and will be augmented in the future
with additional functionality, additional architectures (AVX and Neon
come to mind), etc. But this is enough to get started.
make/CMake support for SIMD building modes (e.g. 'make USE_SIMD=sse4.1')
Bump version with SIMD
ImageBuf and ImageCache: pad buffers by an extra SIMD width so that SIMD
reads don't overstep the allocation sizes.
SIMD instruction speedups for texture lookups

This is a big overhaul of the internals of TextureSystem to make as much
as possible use SSE (and in future updates, other SIMD instruction
sets).  We're seeing 30-60% reduction in time of the texture lookups
themselves, depending on the SSE compatibility level, number of channels
looked up, whether texture derivatives are requested, etc.  Call it
close to a 2x speedup in general. But of course, how much this will
translate into speedup of an app using TextureSystem will depend a lot
on the original percentage of the runtime of the app that was spent
doing the texture math.

This is a first stab, there is more to return to in the future. For
example, we have only SSE-optimized texture(), but really not
texture3d() or environment(). There's probably even more we can squeeze
out of texture() if we try.
Overhaul TextureSystem API -- eliminate nchannels and deriv fields from
TextureOpt, in favor of passing them explicitly to the various texture
API functions. This is all in support of the SIMD internals changes.