Redesign profile page and port to Bootstrap

to do:
- [x] profile sidebar
- [x] mention facebox
- [x] /people/guid/contacts
- [x] adapt tests

This PR fixes
* #5223 
* #4722
* #4658 and #4947 by removing profile pictures from the profile
* #5249 by removing `_profile_sidebar.html.haml`
* #4745

![people view](https://cloud.githubusercontent.com/assets/3798614/4350071/9f7dcd6e-41d4-11e4-8ac8-316e5c1fd3b5.png)
I think the only thing that could change dynamically is the number of your own photos since you aren't able to change anything else from the profile view. I am still not really familiar with RoR so I'd suggest to do the dynamic changes in another PR. However, I tried to add the number of photos and contacts to `#full_hash_with_profile` but I failed. The displayed numbers in the view are wrong. Here is what I did:
````diff
diff --git a/app/assets/javascripts/app/pages/profile.js b/app/assets/javascripts/app/pages/profile.js
index 32298e3..5ecb6dc 100644
--- a/app/assets/javascripts/app/pages/profile.js
+++ b/app/assets/javascripts/app/pages/profile.js
@@ -18,11 +18,6 @@ app.pages.Profile = app.views.Base.extend({
       this._populateModel(opts);
     }
 
-    if( app.hasPreload('photos') )
-      this.photos = app.parsePreload('photos');  // we don't interact with it, so no model
-    if( app.hasPreload('contacts') )
-      this.contacts = app.parsePreload('contacts');  // we don't interact with it, so no model
-
     this.streamCollection = _.has(opts, 'streamCollection') ? opts.streamCollection : null;
     this.streamViewClass = _.has(opts, 'streamView') ? opts.streamView : null;
 
@@ -50,18 +45,12 @@ app.pages.Profile = app.views.Base.extend({
 
   sidebarView: function() {
     if( !this.model.has('profile') ) return false;
-    return new app.views.ProfileSidebar({
-      model: this.model,
-    });
+    return new app.views.ProfileSidebar({model: this.model});
   },
 
   headerView: function() {
     if( !this.model.has('profile') ) return false;
-    return new app.views.ProfileHeader({
-      model: this.model,
-      photos: this.photos,
-      contacts: this.contacts
-    });
+    return new app.views.ProfileHeader({model: this.model});
   },
 
   streamView: function() {
diff --git a/app/assets/javascripts/app/views/profile_header_view.js b/app/assets/javascripts/app/views/profile_header_view.js
index 656c3da..e75d9b0 100644
--- a/app/assets/javascripts/app/views/profile_header_view.js
+++ b/app/assets/javascripts/app/views/profile_header_view.js
@@ -4,8 +4,6 @@ app.views.ProfileHeader = app.views.Base.extend({
 
   initialize: function(opts) {
     app.events.on('aspect:create', this.postRenderTemplate, this);
-    this.photos = _.has(opts, 'photos') ? opts.photos : null;
-    this.contacts = _.has(opts, 'contacts') ? opts.contacts : null;
   },
 
   presenter: function() {
@@ -17,9 +15,7 @@ app.views.ProfileHeader = app.views.Base.extend({
       is_sharing: this.model.isSharing(),
       is_receiving: this.model.isReceiving(),
       is_mutual: this.model.isMutual(),
-      has_tags: this._hasTags(),
-      contacts: this.contacts,
-      photos: this.photos
+      has_tags: this._hasTags()
     });
   },
 
@@ -32,11 +28,11 @@ app.views.ProfileHeader = app.views.Base.extend({
   },
 
   _shouldShowPhotos: function() {
-    return (this.photos && this.photos.count > 0);
+    return (this.model.get('photos')['count'] > 0);
   },
 
   _shouldShowContacts: function() {
-    return (this.contacts && this.contacts.count > 0);
+    return (this.model.get('contacts')['count'] > 0);
   },
 
   postRenderTemplate: function() {
diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb
index ff2783c..cb082b5 100644
--- a/app/controllers/people_controller.rb
+++ b/app/controllers/people_controller.rb
@@ -86,12 +86,6 @@ class PeopleController < ApplicationController
           @contact = current_user.contact_for(@person)
         end
         gon.preloads[:person] = @person_json
-        gon.preloads[:photos] = {
-          count: photos_from(@person).count(:all),
-        }
-        gon.preloads[:contacts] = {
-          count: Contact.contact_contacts_for(current_user, @person).count(:all),
-        }
         respond_with @person
       end
 
@@ -151,12 +145,6 @@ class PeopleController < ApplicationController
       @contacts_of_contact = Contact.contact_contacts_for(current_user, @person)
       @hashes = hashes_for_people @contacts_of_contact, @aspects
       gon.preloads[:person] = PersonPresenter.new(@person, current_user).full_hash_with_profile
-      gon.preloads[:photos] = {
-        count: photos_from(@person).count(:all),
-      }
-      gon.preloads[:contacts] = {
-        count: @contacts_of_contact.count(:all),
-      }
       @contacts_of_contact = @contacts_of_contact.paginate(:page => params[:page], :per_page => (params[:limit] || 15))
       respond_with @person
     else
@@ -220,14 +208,6 @@ class PeopleController < ApplicationController
     @person.try(:remote?) && !user_signed_in?
   end
 
-  def photos_from(person)
-    @photos ||= if user_signed_in?
-      current_user.photos_from(person)
-    else
-      Photo.where(author_id: person.id, public: true)
-    end.order('created_at desc')
-  end
-
   def mark_corresponding_notifications_read
     Notification.where(recipient_id: current_user.id, target_type: "Person", target_id: @person.id, unread: true).each do |n|
       n.set_read_state( true )
diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb
index 8a55700..f0b1330 100644
--- a/app/controllers/photos_controller.rb
+++ b/app/controllers/photos_controller.rb
@@ -29,12 +29,6 @@ class PhotosController < ApplicationController
       respond_to do |format|
         format.all do
           gon.preloads[:person] = PersonPresenter.new(@person, current_user).full_hash_with_profile
-          gon.preloads[:photos] = {
-            count: @posts.count(:all),
-          }
-          gon.preloads[:contacts] = {
-            count: Contact.contact_contacts_for(current_user, @person).count(:all),
-          }
           render 'people/show'
         end
         format.json{ render_for_api :backbone, :json => @posts, :root => :photos }
diff --git a/app/presenters/person_presenter.rb b/app/presenters/person_presenter.rb
index 37f7593..e97952b 100644
--- a/app/presenters/person_presenter.rb
+++ b/app/presenters/person_presenter.rb
@@ -21,7 +21,11 @@ class PersonPresenter < BasePresenter
   end
 
   def full_hash_with_profile
-    full_hash.merge({profile: ProfilePresenter.new(profile).full_hash})
+    full_hash.merge({
+      profile: ProfilePresenter.new(profile).full_hash,
+      contacts: { count: contacts.count },
+      photos: { count: photos.count }
+    })
   end
 
   def as_json(options={})
````