pass explicitly empty labels as empty sets, using keyword arguments

no implicit replacements any more
label annotations always dicts from now on
label types can be extended only explicitly from now on,

not during addition of edges.

This avoids the problematic design of adding new label values to the label typing object the user has passed when instantiating the LabeledStateDiGraph, by requiring that the user explicitly first (collects if necessary, e.g., using list comprehension), then adds those values to the label type, before adding the labeled edges.

From now on checks are performed only in TypedDict, by calling __contains__ of the type. Machine guard mechanisms will have to be updated to this simple approach.
admissible guards checked by __contains__ from now on
typed label value checking now done within TypedDict
only dicts used for handling labels, no lists any more

also: don't filter keeping typed labels, and protect edge TypedDicts, by instantiating a new dict from their contents
labeled graphs should be agnostic of "True" semantics

if you want to find an edge whose label contains True, then do that explicitly in the relevant automata code (automata contain semantics, not raw labeled graphs).
pythonize symbolic guards

by using callable label values to signify symbolic evaluation
refactor by inlining
TypedDict.allowed_values already points to label types
minor refactoring and mv code around
rm __call__ from MathSet and PowerSet

because builtin set is not callable, and callable label types signify symbolic semantics.
Instea create a new list from the object's iterator
rm LabelConsistency, replacing it by label_is_desired
get label types from within TypedDict
refactor label_is_desired
rewrite label_is_desired
deprecate LabeledStateDiGraph