Cache the Uri parser instance in Checkable, results in a 14x performance increase

The parts getter in Checkable is called **very** often, which means caching the Uri parser instance instead of recreating it on every call massively improves performance.

Here's a small timing of a site with ~30 files (external checks ignored):

|before|after|
|------------|------------------|
|**real 0m25.782s**|**real 0m1.810s**|
|user 0m25.377s|user 0m1.681s|
|sys 0m0.384s|sys 0m0.122s|



I think @akoeplinger's original code is valid. If we do `@parts_cached ||=` and the url is invalid, `@parts_cached` is set to `nil`. Which means another call `parts` prompts another attempt at URI parse.

That doesn't mean I don't disagree with @parkr's suggestions! But this does indeed seem to be a slight tweak to get a bunch of performance. Refactoring can come later, methinks.