Additions, improvements, and optimizations for StrMap

It's unfortunate that the foldM implementation can't properly short-circuit, but otherwise is general enough to support a number of other operations.  I've added more efficient JS implementations for select functions, and simplified/generalized some already there.

In a separate commit I've added a basic Data.StrMap.ST mutable interface to JS records.  This part probably still needs test cases, so could be left off for now.

All changes should be fully backwards-compatible.
I tried to clarify this in the commit message: Since we know that all StrMap objects have prototype Object, we know they have no additional enumerable keys, so hasOwnProperty checks are unnecessary.  The only exception would be if people added additional properties to Object.prototype, but that would break all sorts of stuff.  Or if people unsafely cast created objects to StrMap, but then maybe they'd want this behavior.