Respond to bad requests with a 400 status code

- Previously bad requests caused PersistentConnection.ProcessRequest to throw
  resulting in a 500
- Respond with a 403 status code when the client changes identity
- No longer throwing on bad requests reduces extraneous error logging
- Traces logged by TaskAsynceHelper.Catch are now warnings making it easier to filter out those traces

#2450