Added standalone `std::optional` implementation.

Original from https://github.com/AGWA/Optional, minor changes by me at
https://github.com/mosra/optional.
Trade: using `std::optional` instead of pointer in AbstractImporter.

Saves unnecessary heap allocation and saves user from the burden of
explicit deletion, otherwise the usage is the same. Polymorphic types
can't be done using `std::optional`, will fix that later.
Trade: using `std::unique_ptr` when returning polymorphic types.

This requires inclusion of heavyweight <memory> header (~25k LOC), but
data import isn't something the user would want to do in every file, so
it hopefully won't hurt compilation times too much.
Trade: cleanup the dummy classes a bit.

They need to be at least movable to be returnable inside `std::optional`.
Trade: cut Type enum out of AbstractMaterialData class.

Now named MaterialType. It's easier to type this:

    auto t = Trade::MaterialType::Phong;

Than this overlong name, which is moreover ambiguous due to subclassing:

    auto t = Trade::AbstractMaterialData::Type::Phong;
        // or should I use rather Trade::PhongMaterialData::Type::Phong?
Trade: cut InstanceType enums out of ObjectData*D classes.

Now named ObjectInstanceType*D. Similar reasoning as in previous commit,
now easier to type and not involving ambiguities due to subclassing.
Trade: forgotten std::move().