Boris Johnson has said he takes “personal responsibility” for the Tories’ North Shropshire by-election loss.