Re-organized laser-based components

Until now, the code for all laser scanners was in SICKClass.
Refactored code to:
 - create LaserScannerClass in sensors/laserscanner.py
 - make all laser based sensor rely on this common parent class
 - update the doc to have explicitely a generic laser class and preconfigured
   laser scanners (and also, to make it hopefully a bit easier to read)
[doc] gallery macro: do not try to display images for directories
[builder] wrap bpy calls in bpymorse
[sensor] Improve a bit documentation of laserscanner

Document the case where a ray does not hit anything
While here, improve a bit the style, in particular wrapping long lines.
No functional change
[cmake] Don't generate bpy in fakeenv, it is now correctly wrapped
[builder] fix typo in previous commit

and add sick Arc to the LaserSensors,
for its 'RayMat' material
[builder] create RayMat for LaserSensorWithArc
fix typo
[testing] Restore video_camera test semantic

Partially revert cfc076cbdf, which is too simplistic to really test the
correct behaviour of camera
[builder] fix PassiveObject append
[builder] fix add sensor Always not default
[builder] camera object looks in +Z
[test] add image compare for video_camera
[builder] add method save .blend file
[builder] creator rename CameraX -> XCamera
[pymorse] Complete rewrite of the pymorse bindings

This commit closes issue #216. Please refer to the issue for
discussion and a summary of the API changes.

Refer also to the new pymorse documentation for details.

In short:
- for each robot in the simulation, we dynamically create one object in the 'pymorse.Morse' instance
- this object itself contains one sub-object per component
- these sub-objects expose a datastream API, either read-only (for
  sensors): 'get', 'last', 'subscribe'; or write only (for actuators):
  'publish'.
- if exposed by the component in the simulator, RPC services are also
  available, as 'futures'. As a consequence, pymorse NOW REQUIRES
  PYTHON3. Note that cancelling a running service is currently not
  implemented.

Two unit-tests have been added in bindings/pymorse/ that cover most of
the new features.

This commit also introduces a new service 'simulation.details'. This
service returns the tree of robots, components, services, middlewares in
the current simulation
[pymorse] Added support for cancelling asynchronous actions

Simply call 'cancel()' on the future returned by the service call.

This should close issue #216
[pymorse] Make sure request are correctly matched to their response

Previously, the behaviour was undefined when two response arrived in row.
[pymorse] Get rid of the sock.makefile API

Because of buffering issue with 'readline', use directly the socket 'recv' and 'send' API

Should use fnctl.ioctl(sock, termios.FIONREAD) to know exactly how many bytes must be read
[pymorse] Handle PREEMPTED requests