Major redesign of the library

This commit implements a major redesign of the library.

* Curriously recurring template pattern is used to categorize vector
types. Function templates no longer need to be written for each vector
type or their combination, instead, an appropriate vector category may
be used.
* Function templates that accept various vectors return "correct"
vector type. For example, int32 + int32 --> int32, whereas uint32 +
int32 --> uint32, and uint32 + float32 --> float32. See
simdpp/types/tag.h for more information.
* gint## (the old basic_int##) types have been completely removed. The
abovementioned changes make this feature obsolete. Use uint## instead.
* maskdata_* types have been removed. This was a horrible hack,
polluting the design of the library. Masks are completely separate types
that can use data format independent from that of the corresponding
vector type.
* All vector types can be explicitly constructed from any other vector
with the same size.
* Many functions accept more combinations of vector types as arguments.
For example, bitwise functions accept any two vectors of the same size.

Caveats:
* 256-bit support is still broken (i.e. no AVX, AVX2, etc.)
* Bitwise functions do not use expression templates at the moment
* Many functions do not support all combinations of vector types that
are advertised by their API.

This is API-breaking change.
Add some documentation of the internals of the library