support for most simple loop structure

To be able to execute some elements more than once, I had to simplify
Flow.run(). Now we don't keep track of the lists elements_to_do and
elements_left. We always iterate over all elements and only keep track
of the number we executed. If we executed 0, we are done.
test & implement the filter function of loops
test loop with map and filter function
naming for PythonLoopStart/Stop
save/load support for element groups (generalized loop)

Main issue is to create the link between PythonLoopStop and
PythonLoopStart when loading these elements from database. As there can
be more than 1 loop in a flow, I need to store this link in the DB.

A loop is expected to have more elements linked to it in the future
(ie: continue/break elements). Also, there might be other functions
besides loops that need multiple linked elements. For this reason I try
to put as much logic as possible in a generic "ElementGroup" class and
away from the PythonLoop class. When loading from database, we don't
even construct a PythonLoop object. We have enough with the generic
ElementGroup class. We can consider PythonLoop as a pure "helper"
function to conveniently create a PythonLoopStart and PythonLoopStop
object, both linked to the same ElementGroup.

overview of changes:
=> each Element is optionally linked to one ElementGroup
=> each Flow keeps a list of alread-loaded ElementGroups
=> when loading a Flow from database, we ask each Element to check
   if its ElementGroup is already in the list and if not, to append it
=> PythonLoopStop now needs to go through its ElementGroup to find the
   linked PythonLoopStart object.
Loops: stop data calculation when append is False

PythonLoopStop(): customize is_ready(): return True if append is False
  This means run() will be called, which will call run() on
  PythonLoopStart(), which will invalidate the chain after list_item

PythonLoopStart(): invalidate the chain after list_item before trying
  to get the next item.
  This means that list_item will be invalid if get_next_item() reaches
  END OF LIST.

PythonLoopStart(): customize is_done(): return True after END OF LIST
  If we don't do this, the element will stay a candidate element to be
  executed. We could also return False in is_ready(), but returning
  True in is_done() seems more logical.
refactor PythonLoopStart/Stop to LoopStart/Stop

also move from python_loop.py to control_flow.py
refactor: PythonLoop() is now a function instead of a fake Class

Also, due to this change, I can return start & stop from this function,
so I don't need the __iter__()-workaround in ElementGroup anymore to be
able to do start,stop = PythonLoop().
rename PythonLoop() to create_loop()
remaining work on loops has lower priority
Merge branch 'feature/python_loops' into develop