[Additional comment for Posterity]
I have been unable to replicate the error I was getting in a macro, so I think there is either a race issue going on with locking, or it is a random windows fubar outside the tool itself.
I have been through the Omnibus code and tried to see if there was anything that the Omnibus code is doing that my code is not. Previously I had found I was using the string-based record copy method, and that had been corrected earlier. The only other difference I can find is the fact that the Omnibus code has the option to call II_Close() internally, where as my code waits for Alteryx to call II_Close(). My code still cleans up when close is called, and I have added diagnostics to the callback functions and can see them being called.
Just reviewing the Omnibus code has taught me a lot. If anyone else is thinking of writing a C# DotNet Tool, I would recommend first reviewing the SDK doc that ships with Alteryx, and then using the Omnibus framework as the real reference implementation. James has also been amazingly patient and helpful, and I would be happy to help anyone out with whatever help I can give.
Thanks James! @jdunkerley79