Нужна ли библиотека для DI?Нет. Зависимость, переданная в конструктор, уже внедрена снаружи. Библиотека может автоматизировать большой граф. Dependency injection.
Почему реализация хранилища зависит от интерфейса домена?Так бизнес-правило не импортирует детали базы или сети. Runtime-вызов интерфейса и статическая зависимость исходников направлены по-разному. Robert C. Martin: Clean Architecture.
Почему implementation не скрывает тип, возвращаемый публичным методом?Потребителю всё равно нужен этот тип для компиляции. Измените границу, возвращая собственную модель, либо осознанно экспортируйте зависимость через api. Gradle: api и implementation.
Фичи A и B зависят друг от друга. Как разорвать цикл?Выделить реальный общий контракт или перенести координацию в вышестоящий app-модуль. Не складывайте всё подряд в core: новый модуль должен иметь ответственность. Границы модулей.
Реализация read-only storage бросает ошибку на save интерфейса WritableStorage. Что не так?Если договор WritableStorage обещает запись при выполненных условиях, такая подстановка нарушает его. Разделите чтение и запись, чтобы клиент требовал только нужную способность; имя класса само проблему не исправляет. Liskov, Wing: поведенческий подтип.
Ускоряет ли каждый новый Gradle-модуль сборку?Нет универсальной гарантии. Изоляция может уменьшить перекомпиляцию, но растут конфигурация, граф и стоимость поддержки. Измеряйте сценарии сборки. Границы модулей.