Added a unit test for string substitutions in CustomOptions.

This didn't reveal the problem I was hunting, but more tests are always good.
Improved ExecuteApplicationTest.

By using assertEqual() you can actually see what the error message is.
Fixed StringPlug string substitution bug.

When a StringPlug received an input connection from another StringPlug whose value contained a substitution, we were incorrectly calculating the hash for the receiving plug, by not taking into account the substitutions. This was caused by the recent ValuePlug optimisation whereby ValuePlug::hash() traverses to the source plug and hashes the value held there - this bypassed the StringPlug::hash() override for the source plug. The solution is to perform the same "find the source first" optimisation in StringPlug::hash().
Merge pull request #1049 from johnhaddon/substitutionBug

Fixed StringPlug string substitution bug.