Fix circular references

This PR refactors the RedirectPlugin and removes several circular references to help manage garbage collection without having to wait on `gc_collect_cycles()` to kick in.

Marks `$response->getRequest()` as deprecated and uses a clone of the request rather than a reference.

Fixes a regression where injecting a response as part of a request.sent event was retriggering the event workflow of receiving a response.

Updates the HistoryPlugin to actually maintain history in the correct order and to better resemble data sent over the wire.

Add `getRedirectCount()` and `getEffectiveUrl()` to Response objects.