1. модуль в питоне - ОЧЕНЬ ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ. Поэтому его сериализация/десериализация технически возможна (и существует), а вот использование в pickle вызывает несколько вопросов, противоречащих друг другу. Когда было нужно - делал свой
import hook, который подтягивал нужные модули откуда следует. Т.е. из того же источника, откуда и pickled data приходит.
2. __flags__ - из C API. Когда объект написан на питоне - не важны, а для old-style классов не существуют.
Но многие объекты на самом деле имеют C реализацию. Например, None, int, list etc…
HEAPTYPE значит, что type object is dynamically allocated - и значит может быть скопирован. На самом деле тот же класс list объявлен как static variable (ускоряет инициализацию) - и не может быть клонирован-сериализован. Он всегда один и тот же. Проверка base is self.__class__ - именно на это. Стандартные питоновские контейнеры обрабатываются в другом месте. А кусок в _reduce_ex просто проверяет, чтобы пользователь не пытался пиклить объекты - C-extension, для этого не предназначенные.