Setup cargo workspace

We should setup a cargo workspace, so we can start separating lib functionality as well as isolated bin which can be used by the community as separated tools.