In a large stockpot or dutch oven, cook bacon pieces. Start over relatively high heat and then dial the heat down as the oil begins to foam. Stir occasionally. Once all of the bacon is cooked to a nice crisp, remove the bacon with a slotted spoon and transfer to a paper towel lined plate. Remove any excess oil, leaving as much bacon flavor in the bottom of the pot as possible.
Using the same pot over medium high heat, melt the butter. Add the carrot, celery, and onion and cook until tender and just starting to brown, 5-10 minutes while occasionally stirring. Add the garlic, stir, and allow to cook for another minute.
Sprinkle the flour over the mixture and allow to cook for several minutes, stirring frequently. You may need to reduce the heat a bit to keep it from burning.
Add the corn, potatoes, and chicken broth. Stir well, scraping the bottom of the pan to release anything that may have stuck. Cook over medium high heat and bring the mixture to a boil. Cook until the potatoes are tender, about 15-20 minutes.
This next step is optional but highly recommended. Use an immersion blender to blend about half of the soup. You still want chunks, but you also want some of the corn and potato to break down to create a more creamy soup. You can also do this by transferring about half of the mixture to a blender and pulsing a few times.
Reduce heat to low, add milk, heavy cream, chicken, salt and pepper. Cook just long enough to heat through.
Store in the refrigerator up to several days or freeze in air tight container for longer storage.