What is the difference between transient, singleton and scoped in C#?