Use sets for storing *_PASSAGES and *_TAGS categories

Since the most common operation on these is a membership test and the
order doesn't matter, a set is a good choice for the data type.

Also use INFO_TAGS in isStoryText() instead of calling several methods
to check for specific tags.

In StoryFrame.buildIncludes(), when including files with the ".tws"
extension, passages with a title that is a *substring* of an excluded
passage name were skipped. I assume this was a bug and the correct
behavior is to skip only passages where the title is *equal* to an
excluded passage name, as was done for included Twee files (albeit
in a slightly overcomplex way).
Optimized the concatenation of story HTML fragments

The main thing is to avoid adding to a string repeatedly, since this
requires an increasing number of bytes to be copied again and again
as the string grows. Instead, put the fragments in a list and at the
end join that list.

Avoid repeated lookup of the tiddler in the dictionary.

Test whether obfuscation is enabled before testing the title: this
avoids the title check completely when not using obfuscation.

The latter two optimizations probably won't have a noticable impact
on performance; the first one probably will on stories with many
passages.