Good stuff. The decision when to break out into something reusable is a complicated one. I’ve found that the “reusability” for a component could be approximated with the the ratio (implementation complexity / interface size). High ratio, i.e complex code combined with well defined and small interface, means it could be extracted and shared in an effective way.
I find frequently changing interfaces to be a bigger problem than big interfaces. If the big interface doesn't need changing often, it's not an impediment to reuse. But it is often hard to know what the future brings.