SceneCache ROP is interruptable.

This is used to cancel long running local caches.
Using GA_AIFSharedStringTuple instead of GU_Detail::getUniqueStringValue

This was a recommendation by SideFx for speed improvements. It doesn't seem to have helped much in this case, but it didn't hurt, so might as well keep it.
Manually iterating the prims and checking for string matches.

Extracting a large asset (500k polys, 1800 named shapes) took 8 minutes. Profiling showed that GU_Detail copying and GU_Detail::getRangeByValue() took the largest amount of time. By looping over the prims ourself, we avoid both of those calls, and the extraction time drops to 1.5 minutes.
Adding the DetailSplitter.

Its a convenience class for extracting select bits of geometry from a GU_Detail. It is intended to improve performance when making multiple calls to split the same detail. The default use is splitting based on the name attribute, but any primitive string attribute could be used.
Using DetailSplitter in FromHoudiniGroupConverter.

The DetailSplitter simplifies conversion by name.
Using DetailSplitter in HoudiniScene.

HoudiniScene instances that refer to a SOP create a DetailSplitter during construction. Child scenes inherit the splitter of their parent, so only one splitter per SOP is ever created. Using the splitter during readObject reduces the cache time for the large asset (500k polys, 1800 named shapes) from 1.5 minutes to 35 seconds.
Simplifiyng retrieveNode().

Most use cases verify the SOP data themselves if necessary. Removed m_contentPath since it can be easily retrieved when needed. I wasn't able to remove m_nodePath because of complications resolving children via connection. It is not impacting performance, so I'm leaving it for the time being.
Replacing relativePath() with char* search functions.

This removes all calls to SceneInterface::stringToPath, which was the current bottleneck in the profile. Cache time for the large asset reduces from 35 seconds to 3.3 seconds with this and the previous commit.