introduced "VIENNAMINI_PROBLEM" macro+initiated work on'new_problem' ex

@VIENNAMINI_PROBLEM: this macro takes care of code bloat generation
for an actual problem implementation (implemented constructor and
virtual 'run' method -> preparing for convenient implementation
of a 'new user problem' class, which allows a non-intrusive setup
of a new problem and the simulation of this by viennamini

@new_problem: this will be an example depicting how to
setup one's own problem class. I will implement some basic
poisson equation, and show how one can implement a new problem.
(use case: joydeep)
--> in the middle term, a run-time approach would be important.
we probabl need a string->viennamath::expression conversion for this
 but for now, setting up a new problem 'programmatically' is
 flexible enough
'new problem' example, first draft finished+refactored problem API

the problem API up until now required in the constructor of an actual
problem the device and the config class. however, this is not reasonable
in the case where the user sets up his own problem, it kinda
overcomplicates the API.
therefore, the device and config obejcts are now set via an appropriate
'set' function in the problem class (using handles, i.e.g, shared
pointers) -> this way the user can write in his application source:
    viennamini::simulator mysim;
    // .. load mysim, i.e., setup the device
    mysim.set_problem(new my_very_own_problem());
    mysim.run();