Moved backend to separate submodule (simplifies coverage)