Synthesize: Implement conflict-free net synthesis

Signed-off-by: Uli Schlachter <uli.schlachter@informatik.uni-oldenburg.de>
Test: Exhaust memory faster

Previously these tests appended a constant string to a string builder until a
OutOfMemoryError was thrown. This commit replaces this with code that appends
increasingly longer strings to the StringBuilder. This way more time is spend
for allocating memory and less time is needed for running the loop.

This halfes the test's run time from 10 seconds to 5 seconds for me.

Signed-off-by: Uli Schlachter <uli.schlachter@informatik.uni-oldenburg.de>
ADT: Use less SoftReferences

A SoftReference is used for caches. The garbage collector is allowed to collect
whatever the SoftReference points to, if it wants to and needs the memory. If
enough memory is available, the SoftReference stays valid and the object that it
references stays alive.

However, saving a cache in a cache doesn't help. If the garbage collector is
under memory pressure, it will clean up softly reachable objects. In the case of
our data structures, this means that all the pre- and postsets will be removed.
Thus, it doesn't improve things if we save another soft reference in a soft
reference.

This commit thus changes the data structure to only have an "outer" soft
reference which doesn't refer to other soft references.

Signed-off-by: Uli Schlachter <uli.schlachter@informatik.uni-oldenburg.de>