Make NotFoundHttpException only be thrown when dispatching and not internally by the controller

Basically the `__call` overloading in the controller to throw the `NotFoundHttpException` feels hacky and like a left over from the old routing system. It causes issues in controllers where if you make a typo or something when calling a method in the controller you will get a not found exception instead of a normal undefined method error. Very misleading and annoying.

Added tests and then the new code with `is_callable` in the dispatcher instead.