Melt butter in a large saucepan, add onion and garlic and cook until they start to turn golden brown. Add carrots and celery and cook on low to medium heat until they start to soften. Add the flour, cook and stir for a few more minutes, being careful that it doesn't burn. Add chicken broth very slowly and keep whisking. (If you add the liquids in too fast it won't be as thick in the end.) Stir in milk slowly (add however much depending on how much soup you want to end up with). Steam or boil potatoes in a separate pan until a fork can go through them, and then add them to the soup.
While continuing to stir, add in the bacon or ham (if you are using them), plenty of salt and pepper, garlic powder, and other herbs as desired – getting this step right is the key to great flavor, so taste test until it's yummy!
Serve and enjoy. Toppings not only make it taste yummy, but make it look pretty, too. You can add sour cream, shredded cheese, bacon, chopped green onion or chives.
You can easily double this for a big crowd and keep warm in a crock pot until it's time to serve.