Implement CRUD

This is for #27 

While waiting DataStorage transaction to be finished, this PR is just to show how I will implement actions.

Some design choices
-  Should UNDO be implemented in DataStorage? This will simplify the undo query as just a transaction consisting of one undo operation. Then just re-apply the currently active filter to refresh the GUI.
- Should I always keep a list of all task (in TaskGraph object form) so that filter operation simply filter the graph instead of piercing through datastorage and doing many unnecessary serial/deserialization?