llvm contexts are naturally thread-local, so dynamic binding might make sense here