oelite: DictMeta: send unpickled data through deepcopy
oelite: DictMeta: send unpickled data through deepcopy

Since we pickle recipes independently, we lose object identity when
unpickling. This means that we don't get most of the memory savings
provided by forcing string interning in various places. We can recover
those savings by passing the unpickled dicts through copy.deepcopy,
where we have (in "oelite: DictMeta: force string interning when doing
deep copies") hooked in to ensure that all strings get interned.

The memory saving is quite substantial:

Before:
Total 1403878 objects, 162 types, Total size = 329.8MiB (345785802 bytes)
 Index   Count   %      Size   % Cum     Max Kind
     0  477849  34 205125720  59  59  196888 dict
     1  488359  34  60349822  17  76   44688 str
     2  165064  11  54145344  15  92    4328 set
     3  212319  15  15640736   4  96     456 tuple

After:
Total 963686 objects, 162 types, Total size = 277.8MiB (291258042 bytes)
 Index   Count   %      Size   % Cum     Max Kind
     0  477849  49 205125720  70  70  196888 dict
     1  165064  17  54145344  18  89    4328 set
     2  188808  19  13768624   4  93     456 tuple
     3   71836   7   7746342   2  96   44688 str

Next we'll try to attack the gross memory consumption by the gazillion dicts.

sknsean/core,sknsean/core,sknsean/core,sknsean/core,sknsean/core