dlfcn: implement dlclose()

Outline of the implementation:

1. For each object, we need an unordered_set<std::shared_ptr<elf::object>>
   of other objects which were used to resolve its symbols.

2. Add std::enable_shared_from_this to class object which would allow to
   get a shared_ptr to it without any additional code.

3. In object::resolve_pltgot(), symbol(sym) returns a symbol_module
   which includes a pointer to the object containing the symbol.

4. For this object*, call object->shared_from_this() and add it to the
   unordered_set

5. Delete the shared_ptr in dlclose(), which will decrease the reference
   count of its dependent modules via the shared_ptrs.

I have tested it via the following method:

  Add a printf in remove_object

  extern int add(int,int);
  dlopen("add.so",RTLD_NOW); 	// resolves the add function
  int c = add(1,2); 	   	// the running .so now contains a reference to the add.so
  dlclose(add.so);		// this does not result in call to remove_object
  return;			// remove_object is first called for the .so and then for add.so

Fixes #150.

Reviewed-by: Nadav Har'El <nyh@cloudius-systems.com>
Signed-off-by: Jaspal Singh Dhillon <jaspal.iiith@gmail.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>