[refactoring] Moved abstract implementation into an internal package, extracted API into an interface