How does one typically handle complex program flow? - C#