Implement command/query separation

It enables:

1. Handling errors differently
2. Handling commands and queries