Migrate CMakeLists.txt to MSVC 12.0

For an unknown reason, the include directories config stop working. With
this change, each module defines a global property `target_INCLUDE_DIR`
exporting its include dir. Now this is the variable used in each
`include_directories` directive.
Reimplement some tricky parts in C++11

With the arrival of MSVC 12.0 some amazing C++11 features not supported
before appear. More concisely, enum classes and variadic templates are
now supported.

This change reimplements some parts of the code using enum classes and
variadic templates where appropriate.