Similar to how Optimizely implements IOptimizely, OptimizelyUserContext should also implement an interface so that consumers of your SDK can properly mock it for unit testing.
I think it would be a fairly small change.
Add an IOptimizelyUserContext interface.
Implement that interface in the OptimizelyUserContext class.
Update OptimizelyUserContext constructor to accept an IOptimizely instance instead of an Optimizely instance.
Update the CreateUserContext method signature to return this new interface rather than the actual type.
Similar to how Optimizely implements IOptimizely, OptimizelyUserContext should also implement an interface so that consumers of your SDK can properly mock it for unit testing.
I think it would be a fairly small change.
All actual implementations remain the same.