split into submodules so dependent code can link against a normal (non-uber) jar