Abstract storage engines

This pr create a storage engine interface and modify shards to use the
interface instead. It also adds a B-Tree implementation and benchmark
tool to compare the performance of the different storage engines.

TODO:

- [x] Make the configuration backward compatible. There were some changes to the config file and we need to be backward compatible with old versions of the config
- [x] Add some metadata to shards so we know what their type is when we're opening existing shards