framenet.py: link together objects rather than storing pointers; new propagate_semtypes() method

Various changes, with updated test cases.

Note that the aim was to link everything together without incurring too much overhead at runtime, so information that would be slow to load is loaded lazily. If they are needed, the semtype hierarchy and frame relations are loaded all at once. Typically names/IDs of frames and LUs are all loaded from index files, with details from the individual frame/LU files filled in as necessary. This is accomplished with a `Future` wrapper that loads its contents on demand.