Initial refactor of N2VC

- Add libjuju.py to encapsulate all code related with the communication using libjuju
- Replace juju_observer with juju_watcher
- Add utils with some utilities like EntityType, FinalStatus, and JujuStatusToOSM

Change-Id: I5d46ad65d6ed37b49bf2504209bfdd46d1b5a7e4
Signed-off-by: David Garcia <david.garcia@canonical.com>
diff --git a/n2vc/exceptions.py b/n2vc/exceptions.py
index 09f3573..061cd7a 100644
--- a/n2vc/exceptions.py
+++ b/n2vc/exceptions.py
@@ -17,10 +17,26 @@
     """The Charm can't be found or is not readable."""
 
 
+class JujuControllerFailedConnecting(Exception):
+    """Failed connecting to juju controller."""
+
+
+class JujuModelAlreadyExists(Exception):
+    """The model already exists."""
+
+
 class JujuApplicationExists(Exception):
     """The Application already exists."""
 
 
+class JujuApplicationNotFound(Exception):
+    """The Application cannot be found."""
+
+
+class JujuMachineNotFound(Exception):
+    """The machine cannot be found."""
+
+
 class N2VCPrimitiveExecutionFailed(Exception):
     """Something failed while attempting to execute a primitive."""
 
@@ -157,3 +173,7 @@
 
     def __repr__(self):
         return self._message
+
+
+class EntityInvalidException(Exception):
+    """Entity is not valid, the type does not match any EntityType."""