Create IOperation interface for Query Engine

Related to #67
@evansb please check if it is okay

Brief for the rest:
It is the object that will be passed to DataStore after QueryEngine has parsed the query from NLP. It will be used to fulfil the requirement that DataStore must be transactional ( #27 ).
Another object Transaction will be implemented later on to contain a list of operation that made up a transaction, and DataStore will be managing the transaction objects. Anything I missed/misunderstood from our discussion this afternoon?
commit and rollback should be methods of a transaction, because:

```c++
Transaction t(DataStore.begin());
DataStore.post(task);
Transaction t2(DataStore.begin());
DataStore.delete(task2);
t2.rollback();
t.commit();
```