Place the garlic, ginger, and canola oil into a food processor or blender. Blend until smooth and set aside.
Cut the chicken thighs into large, bite-sized pieces. Place the pieces into a large zip-top bag and set aside.
In a large bowl, whisk together the yogurt, salt, pepper, and 3 tablespoons of the garlic-ginger paste until smooth. Pour the yogurt mixture into the zip-top bag with the chicken. Marinade the chicken in the refrigerator for at least 2 hours, or overnight.
Once the chicken has finished marinating, prepare the sauce. Melt the butter with the olive oil in a large dutch oven or heavy-bottomed skillet over medium-high heat. Once melted, add the remaining garlic-ginger paste and cook until fragrant, about 2 to 3 minutes. Add the onion, serrano peppers, and tomato paste and cook until the tomato paste starts to turn a darker red, about 2 to 3 minutes. Add the garam masala, paprika, and cayenne pepper and cook for an additional minute.
Add the water and Roma tomatoes and cook for about 30 minutes, until the sauce has thickened. Once thickened, turn off the heat and allow the sauce to cool for a few minutes. Using an immersion blender, blend the sauce until smooth and no lumps remain (alternatively, carefully transfer the sauce to a blender and blend until smooth). Then, bring the sauce back to a simmer in the dutch oven.
While the sauce is reheating, heat an indoor grill over high heat. Once hot, add the marinated chicken pieces in batches and grill until each side is seared and browned. The center of the chicken thighs don't need to be cooked through. Add the chicken pieces to the sauce and cook for 10 to 15 minutes over medium heat.
Reduce the heat to low and stir in the heavy cream and chopped cilantro. Taste the sauce and adjust the seasonings as necessary. If the sauce is a little too acidic, add a drizzle of honey to balance the flavors. Serve immediately with rice or naan.