Refactor the structure, including add 4D data support, reduce complex signal connection, etc.

To optimise the software structure, I refactor the core part.

As the center of the modules, the DataModel would send signals to LayerViewer and ImageViewer when the data changed. The DataModel also receives signals from LayerViewer and ImageViewer when the users make a change.

In module Bpdataset, I add support for 4D data.

And fix a bug in Mac OS X.

Also, there could be some optimizations in DoStack's signal.