Какой вариант наиболее приемлемый? Какие есть либы для Python, упрощающие эту задачу?
вопрос был скорее о либах, которые инкапсулируют отправку данных, отправляя, например, размер передаваемых данных, перед отправкой самих данных.
sock.sendall("%s%s" % (len(data), data))
В парсинге json проблем не вижу, чтение блокирующие, если не смогли распарсить, читаем ещё символ и пробуем снова. Если ошибка чтения значит канал закрыт.
Все это субьективно и у каждого по своему, но в общем случае
critical - например необработанные исключения
fatal - ошибки которые приводят к полной неработоспособности программы